아사히카와에서 온천을 끝마치고, 훗카이도로 이동했다.훗카이도 호텔에 들어서고, 아내와 무엇을 먹을지 고민했다.오늘은 카레다 싶었는데, 구글맵을 켜놓고 보았는데, 이미 저녁(7-8시)이라 대부분 문을 닫거나 곧 닫을 상태였다.고민 중에 호텔에서 배부해준 맛집 지도를 펼쳐보았다. 음... 이것저것 구글 맵에 검색해 보았는데 평점이 높은 곳은 거의다 문을 닫은 상태였다.아내가 카레를 먹고 싶다했고, 마침 맛집 지도에 Algo 라는 곳이 있었다. 구글 평점을 보니 괜찮은데 리뷰 수가 그닥 적었다. スープカレーアルゴ · 일본 〒064-0805 Hokkaido, Sapporo, Chuo Ward, Minami 5 Jonishi, 6 Chome−12★★★★★ · 일본식 카레 전문식당www.google.com 나는..
이번에는 트랜잭션 관심 분리와 애플리케이션 이벤트 활용에 대해 설계문서를 작성해볼 것입니다.시나리오는, 좌석 예약 시나리오로 플로우는 다음과 같다.1 예약정보 저장 2 계좌 정보에 고객정보 있는지 확인2.1 계좌 정보에 고객 정보가 없다면 계좌 정보에 고객 정보 생성3 결제 내역 생성4 결제 히스토리에 결제 5 해당 고객 계좌 정보에 차감금액 입력위 플로우는 하나의 트랜잭션으로 묶인다.코드는 다음과 같다. @DistributedLock(key="#userId") public boolean payForPreReservedSeat(int amount, Long userId) throws Exception { Reservation reservation = jpaReservationCor..
이번에는 트랜잭션 관심 분리와 애플리케이션 이벤트 활용에 대해 설계문서를 작성해볼 것입니다.시나리오는, 좌석 예약 시나리오로 플로우는 다음과 같다.1 예약정보 저장 2 계좌 정보에 고객정보 있는지 확인2.1 계좌 정보에 고객 정보가 없다면 계좌 정보에 고객 정보 생성3 결제 내역 생성4 결제 히스토리에 결제 5 해당 고객 계좌 정보에 차감금액 입력위 플로우는 하나의 트랜잭션으로 묶인다.코드는 다음과 같다. @DistributedLock(key="#userId") public boolean payForPreReservedSeat(int amount, Long userId) throws Exception { Reservation reservation = jpaReservationCor..
사용자가 임의로 서비스에 접근할 때 서버의 처리비용 그리고 DB의 처리비용을 완화하려고 대기열 구현을 하는 것은 흔할 수 있다. 선착순 문제라고 생각하면 쉽다.대기열 순번을 구현할 때, 순번은 어딘가에 영속적으로 저장되어야하는데 DB와 Redis 두 개를 선택사항을 두고 고민했고, 나는 대기열을 이용할 때 Redis를 활용했다. 왜냐하면 다음과 같은 이유가 있다.1. 대기표 순번은 아주 단기간에 몰리는 트래픽을 처리하는데 사용할 필요가 있다. Read, Write 비용이 높다.2. 피크 타임에 단기간에 몰린 뒤 서비스가 완료된 뒤 그 이후에는 필요가 없다. 즉, DB에 쌓는다면 필요없는 레코드가 수백만건이 쌓일 것이다. 무언가가 배치로 DB Table로 부터 레코드를 지워야한다. 그러나 Redis를 활용..
항해 99 과정서 콘서트 좌석 관련 테이블 형태는 다음과 같다.제약조건: 좌석수: 1~50콘서트수: 1~200좌석상태: EMPTY, RESERVEDseat_number: 좌석 정보 show_id: 콘서트 아이디occupied_status: EMPTY, RESERVED 이다.1번 콘서트에서 잔여좌석 확인때 다음과 같이 수행한다.select * from seat_info where occupied_status = "EMPTY" and show_id = 1;Explain view로 보면 Full Table Scan을 수행한다. 여기서 풀테이블 스캔을 피해가려면 Index를 걸 수 있다.Index는 Cardinality가 큰 녀석을 걸면된다. 직감적으로 show_id에 걸면 될 것이다.(1~50)이므로.Ind..
Garbage Collection Python의 GC는 기본적으로 암묵적으로 진행된다. 어떻게 암묵적으로 진행되는지는, PEP 556에 따르면 기회주의적으로 따른다고 한다. 새로운 allocation이 진행될 때, allocation을 통계적으로 연산하여 휴리스틱하게 진행된다고 한다. 이를 보고 implicitly opportunistic 이라고 한다. GC를 명시적으로 collect 하기 위해선 다음 코드를 수행해야한다. gc.collect() 자, 그럼 어떻게 암묵적으로 또는 명시적으로, 어떤 GC를 진행하고 있는 것일까? Reference Counting Python GC는 기본적으로 reference count로 수행된다. reference count 란 C++ 의 shared ptr과 동작방식이..
이번에는 grafana cloud 에서 alert를 설정하는 것을 알아보겠습니다. prometheus 에서 alert rule을 설정하는데 두 가지 방법이 있는데 하나는 alertmanager 이고, 하나는 grafana에서 설정하는 방법입니다. grafana 4.0 이전 버전에서는 alert rule을 사용할 수 없어, prometheus/alertmanager https://github.com/prometheus/alertmanager 을 추가적으로 설정해줘야합니다. 다행히도 현재 grafana 또는 grafana cloud 에서는 사용할 수 있습니다. Alert Rule에 새로운 rule을 추가해봅시다. node-exporter 에서 지원하며 추적할 metric을 추가하고(A), 그리고 B, C에 ..
이번 포스팅에서는 프로메테우스와 그라파나 클라우드를 설정하는 방법이 가능하다는 것을 포스팅 해보려고 합니다. 현재는 무급으로 작은 사이드 프로젝트(스트리머 우왁굳)에 참여하고 있습니다. 팬이라서.. 프로메테우스 를 설치하는 것은 k8s 또는 머신에 설치하는 방법 두 가지가 있으나, 저희 팀은 k8s를 사용하지 않기 때문에 머신에 설치할 예정이었습니다. 설치하는 방법은 prometheus의 GETTING STARTED 를 참고하면됩니다 만 .. https://prometheus.io/docs/prometheus/latest/getting_started/ Getting started | Prometheus An open-source monitoring system with a dimensional data ..
항상 주변을 단정히 정돈하는 사람은 단지 찾기를 너무 귀찮아하는 사람이다. - 독일 속담 가장 기본적인 수준에서 데이터베이스는 두 가지 작업을 수행한다. 어떤 데이터를 받으면 데이터를 저장하고 나중에 그 데이터를 요청하면 다시 데이터를 제공한다. 2장에서 애플리케이션 개발자가 데이터베이스에 데이터를 제공하는 형식을 설명했다. 그리고 나중에 다시 요청할 수 있는 메커니즘인 데이터 모델과 질의 언어도 살펴봤다. 이번 장에서는 같은 내용을 데이터베이스 관점에서 살펴본다. 즉, 데이터베이스가 데이터를 저장하는 방법과 데이터를 요청했을 때 다시 찾을 수 있는 방법을 설명하겠다. 데이터베이스가 저장과 검색을 내부적으로 처리하는 방법을 애플리케이션 개발자가 주의해야 하는 이유는 무엇일까? 대개 애플리케이션 개발자가 ..
- Total
- Today
- Yesterday
- 가상 면접 사례로 배우는 대규모 시스템 설계 기초
- 최단경로 알고리즘
- 시뮬레이션
- javascript
- Simulation
- 대규모 시스템 설계 기초
- grafana cloud
- Propositional and Predicate Logic
- Discrete Mathematics
- 데이터 중심 애플리케이션 설계
- 아레나 시뮬레이션
- rosen
- 그라파나
- 엄청난 인내심과 시뮬레이션을 위한 아레나 툴
- arena simulation
- Arena
- 이산수학
- flutter
- 이산 수학
- 아레나시뮬레이션
- 백준
- 아레나
- 로젠
- 자바스크립트 예제
- beginning javascript
- paul wilton
- 항해99
- Trie
- 자바스크립트
- 명제논리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |