N° 01 — 목록
'Software Architecture' (43)
-
Software Architecture/DDD & PatternsDDD Patterns - 03. 애그리거트 설계
계란판 하나가 곧 트랜잭션 하나 — 애그리거트 설계계란판을 옮긴다고 하자. 판 위의 계란들은 함께 옮겨진다 — 하나를 빼면 판이 기울어 다른 계란도 움직인다. 두 판은 따로 옮긴다. 한 판의 계란이 다른 판에 영향을 주지 않는다. 판의 크기가 중요하다 — 너무 크면 무거워서 들기 어렵고(경합), 너무 작으면 관리할 판이 많아진다.애그리거트(aggregate)는 이 계란판에 해당한다. 하나의 트랜잭션에서 함께 변경되는 객체 묶음이고, 다른 애그리거트와는 독립적으로 다뤄진다. 애그리거트 설계는 "어디까지를 한 판에 담을 것인가"를 정하는 일이다. Vernon은 에서 애그리거트를 "일관성 경계(consistency boundary)"라 불렀다 — 한 경계 안은 강한 일관성(한 트랜잭션), 경계 밖은 최종 일관..
-
Software Architecture/DDD & PatternsDDD Patterns - 02. DDD 전술적 설계
신분증 있는 사람과 동전 — 엔터티, 값 객체, 애그리거트사람을 식별할 때 신분증을 본다. 같은 이름, 같은 생김새라도 주민번호가 다르면 다른 사람이다. 반면 동전은 식별 번호가 없다 — 100원짜리 두 개는 교환해도 아무도 모른다. 가치가 같으면 같은 것으로 취급한다. 이 둘은 "객체"처럼 보이지만 식별 방식이 근본적으로 다르다.DDD의 전술적 설계는 도메인을 이루는 객체들을 이렇게 식별 방식과 수명에 따라 나눈다. Evans가 에서 정의한 빌딩 블록이다 — 엔터티, 값 객체, 애그리거트, 도메인 서비스, 도메인 이벤트. 각각 다른 규칙과 책임을 갖는다.엔터티 — 신분증으로 식별되는 객체엔터티(entity)는 식별자(identity)로 구별되는 객체다. 두 Order가 같은 내용(같은 상품, 같은 금액..
-
Software Architecture/Distributed SystemsDistributed Systems - 12. 회복탄력성
회복탄력성 패턴 — 장애가 전파되는 것을 막는 법2015년 한 시스템에서 한 하위 서비스가 30초간 응답 지연을 일으켰다. 호출하던 상위 서비스가 스레드 풀을 모두 점유당해 응답 불능에 빠졌다. 그 상위 서비스를 호출하던 더 상위 서비스도 같은 운명을 겪었다. 4단계 위의 서비스까지 멈췄다 — 한 서비스의 지연이 연쇄적으로 전파돼 전체 장애가 됐다. 01편(분산의 8가지 오해)에서 본 "네트워크는 신뢰할 수 없다"를 코드로 방어하지 않은 결과. 이 장애를 막는 패턴들이 회복탄력성(resilience)이다. timeout, retry, circuit breaker, bulkhead, load shedding — 이 패턴들이 분산 시스템의 장애를 국소화하고 전파를 차단한다.비유로 감 잡기 — 배의 격벽과 퓨..
-
Software Architecture/Distributed SystemsDistributed Systems - 11. 서비스 디스커버리·게이트웨이
서비스 디스커버리와 API 게이트웨이 — 클라이언트가 어디로 보낼까2016년 한 회사가 30개의 마이크로서비스를 운영했다. 각 서비스의 URL이 설정 파일에 적혀 있었다. 어느 날 인프라팀이 로드 밸런서를 교체하면서 모든 서비스의 IP가 바뀌었다. 설정 파일을 모두 수정하고 재배포하는 데 하루가 걸렸다. 그 사이 프로덕션은 중단됐다. 서비스가 어디 있는지 알아내는 것조차 복잡한 작업이 된 것이다. 또 다른 문제 — 30개 서비스마다 각자 인증, 속도 제한, 로깅을 구현했는데, 코드가 중복되고 정책이 어긋났다. 이 두 문제를 다루는 패턴이 서비스 디스커버리와 API 게이트웨이다. 이 글은 두 패턴과 그 현대적 변형인 서비스 메시까지 다룬다.비유로 감 잡기 — 호텔 프론트 데스크큰 호텔에 왔다고 상상하자. ..
-
Software Architecture/Distributed SystemsDistributed Systems - 10. 일관적 해싱
일관적 해싱 — 노드 추가/제거 시 최소 이동2014년 한 시스템이 4개 노드로 운영되다가 트래픽이 늘어 5개로 확장했다. 해시 파티셔닝(05편)을 썼기 때문에, 노드가 4→5로 바뀌자 전체 데이터의 80%가 다른 노드로 이동해야 했다. 클러스터가 몇 시간 동안 비정상적으로 동작했고, 확장은 실패로 끝났다. 노드 하나를 추가했을 뿐인데 데이터 대부분이 움직이는 현상 — 이건 해시 분할의 근본적 한계다. 이 한계를 해결하는 기법이 일관적 해싱(consistent hashing)이다. 1997년 David Karger 등이 발표한 이 기법은 — 노드가 추가·제거될 때 데이터 이동을 최소화한다. 오늘날 Dynamo, Cassandra, Memcached, CDN이 쓰는 핵심 기법이다.비유로 감 잡기 — 원형 ..
-
Software Architecture/Distributed SystemsDistributed Systems - 09. 시간·순서·클럭
시간, 순서, 클럭 — 분산 시스템에서 "먼저"를 정하는 법2018년 한 분산 데이터베이스에서 두 사용자가 거의 동시에 같은 계좌에서 출금했다. 한 요청은 서울 노드에, 다른 요청은 부산 노드에 도착했다. 두 노드는 각자 자기 요청을 먼저 처리했다고 기록했다. 왜냐 — 두 노드의 시계가 7ms 차이가 났기 때문이다. 서울 노드의 시계가 10:00:00.007이었고, 부산 노드의 시계가 10:00:00.000이었을 때, 두 요청의 실제 도착 시간이 정확히 같았다면 — 두 노드는 서로 다른 "먼저"를 기록한다.어느 쪽이 "진짜 먼저"인가. 이 질문에 답하지 못해 시스템은 임의로 한쪽을 골랐다가 사용자 불만을 받았다. 모놀리스였다면 — 단일 시계가 "이 쪽이 1ms 빨랐다"라고 결정했을 것이다. 분산에선 시계..