분산 시스템 용어집
분산 시스템 분야의 개념 34개를 한 장에 모았습니다. 2PC · 네트워크 분할 · 리더 선출 · 멱등 처리 등 — 코드베이스에서 뽑아 뜻과 관계를 정리했습니다.
- 2PC (two-phase commit, 2단계 커밋, XA)
- 조정자가 모든 참여자에게 준비를 묻고, 전원이 동의하면 커밋을 지시하는 프로토콜. 조정자가 멈추면 참여자가 락을 쥔 채 기다린다
- 네트워크 분할 (network partition)
- 노드는 살아 있는데 서로 통신이 끊겨 두 무리로 갈라진 상태. CAP 정리가 다루는 P 가 이것이다
- 리더 선출 (leader election)
- 여러 노드 중 하나를 조정자로 뽑아 쓰기·스케줄 같은 단독 작업을 맡긴다. 과반 합의로 뽑으면 갈라진 쪽 중 한쪽만 리더를 가진다
- 멱등 처리 (idempotency, 멱등성, idempotent consumer)
- 같은 요청·메시지를 여러 번 받아도 한 번 처리한 결과가 되게 한다. 처리한 이벤트 ID 를 원장에 남기고 다시 오면 건너뛰는 식이다. 재시도와 at-least-once 전달의 전제다
- 백프레셔 (backpressure, 배압)
- 소비자가 감당할 수 있는 만큼만 생산자·상류에서 받도록 흐름을 조절한다. Kafka 는 소비자가 당겨 가는(pull) 구조라 한 번에 가져오는 양으로 조절한다
- 벌크헤드 패턴 (bulkhead, 격벽)
- 의존별로 스레드 풀·커넥션·동시 호출 수를 따로 떼어 둔다. 한 의존이 느려져도 그 몫만 차고 다른 호출은 계속 돈다
- 보상 트랜잭션 (compensating transaction, 보상)
- 이미 커밋된 단계의 효과를 업무적으로 되돌리는 새 트랜잭션(예: 재고 예약 해제, 결제 취소). DB 롤백과 달리 기록이 남고 그 자체도 실패할 수 있다
- 분산 시스템 (distributed system, 분산 아키텍처)
- 여러 노드·서비스가 네트워크로 나눠 일하는 시스템. 장애를 가정하고, 데이터를 나누고 복제하고, 일관성 수준을 고르고, 시간과 순서를 맞추고, 노드끼리 합의하고, 트랜잭션을 잇고, 메시지를 주고받고, 장애를 가두는 일로 읽는다
- 분산 트랜잭션
- DB 가 서로 다른 서비스들에 걸친 한 업무를 전부 되거나 전부 안 되게 잇는다
- 비동기 메시징
- 서비스끼리 브로커를 사이에 두고 이벤트·명령을 주고받는다. 보내는 쪽과 받는 쪽의 속도·가용성이 서로 묶이지 않는다. 브로커 내부와 전달 보장 설정은 메시징 · 스트리밍 도메인이 다룬다
- 사가 패턴 (saga, saga pattern)
- 분산 트랜잭션을 서비스별 로컬 트랜잭션의 연쇄로 나누고, 중간에 실패하면 앞 단계를 보상 트랜잭션으로 되돌린다. 조정 방식은 이벤트를 주고받는 코레오그래피와 명령을 내리는 오케스트레이션 둘이다
- 서비스 디스커버리 (service discovery)
- 호출할 서비스 인스턴스의 주소를 실행 시점에 찾는다. 이 레포는 별도 레지스트리(Eureka)를 걷어 내고 쿠버네티스 Service 의 DNS 이름으로 부른다
- 서킷 브레이커 (circuit breaker, CB)
- 최근 호출의 실패율이 문턱을 넘으면 회로를 열어 한동안 호출을 즉시 실패시키고, 시간이 지나면 반만 열어(half-open) 몇 건으로 회복을 확인한다. 죽은 의존을 기다리느라 자원이 묶이는 것을 막는다
- 소비 정체 (consumer stall)
- 소비자가 생산 속도를 따라가지 못하거나 한 메시지에 막혀 밀린 메시지가 계속 쌓이는 상태
- 스트림 처리 (stream processing, 윈도 집계)
- 끝없이 들어오는 이벤트를 키별로 묶고 시간 창(window)으로 잘라 흐르는 동안 집계한다. 배치로 모았다가 나중에 세는 대신 지연을 초·분 단위로 줄인다. 창·상태 저장소·조인은 메시징 · 스트리밍 도메인이 다룬다
- 스플릿 브레인 (split brain)
- 분할된 양쪽이 각자 자기가 리더라고 믿고 쓰기를 받는 상태. 다시 합쳐질 때 충돌한 쓰기를 되돌릴 수 없다
- 실패율 (failure rate, error rate, 오류율)
- 최근 호출 창에서 실패한 호출의 비율. 서킷 브레이커가 회로를 열지 판단하는 값이다
- 아웃박스 패턴 (transactional outbox, outbox)
- 업무 데이터와 보낼 이벤트를 같은 로컬 트랜잭션으로 아웃박스 테이블에 쓰고, 별도 릴레이가 그 행을 읽어 브로커로 발행한다. DB 커밋과 발행이 어긋나는 것을 막는다
- 연쇄 장애 (cascading failure, 장애 전파)
- 한 의존이 느려지면 호출한 쪽의 스레드·커넥션이 응답을 기다리며 묶이고, 그쪽도 느려져 장애가 호출 사슬을 거슬러 번지는 상태
- 이중 쓰기 불일치 (dual write)
- DB 쓰기와 메시지 발행을 따로 하다가 한쪽만 성공한 상태. 주문은 저장됐는데 이벤트가 없거나, 이벤트만 나가고 저장은 롤백된다
- 장애 격리
- 한 서비스·외부 의존의 장애가 호출한 쪽으로 번지지 않게 기다림을 끊고, 자원을 나누고, 다시 시도하고, 넘치는 부하를 버린다
- 재시도 패턴 (retry)
- 일시적 장애(타임아웃·연결 끊김)로 실패한 요청을 정해진 횟수·간격으로 다시 보낸다. 받는 쪽이 멱등이어야 안전하고, 업무 오류는 재시도하지 않는다
- 재시도 폭주 (retry storm, retry amplification)
- 막 회복하려는 서비스에 여러 호출자가 동시에 재시도를 퍼부어 다시 쓰러뜨리는 상태. 계층마다 재시도하면 호출 수가 곱으로 불어난다
- 전달 보장 수준 (delivery semantics, at-least-once, exactly-once, at-most-once)
- 메시지가 몇 번 도착하는지에 대한 약속. at-most-once(유실 가능) · at-least-once(중복 가능) · exactly-once(브로커·소비자 협조 필요) 셋이다. 각 보장을 만드는 방법은 메시징 · 스트리밍 도메인이 다룬다
- 조정 · 합의
- 여러 노드가 한 값·한 리더·한 순서에 동의하고, 누가 자원을 쥘지를 정한다
- 중복 배달 (duplicate delivery, redelivery)
- 오프셋 커밋 전 재시작·재시도·리밸런스로 같은 메시지가 두 번 이상 도착하는 상태. at-least-once 전달에서는 정상 동작이다
- 지수 백오프 (exponential backoff)
- 재시도 간격을 1·2·4·8초처럼 배로 늘리고 상한을 둔다. 회복 중인 의존에 줄 부하를 시간이 갈수록 줄인다
- 최종 일관성 (eventual consistency)
- 새 쓰기가 멈추면 모든 복제본이 결국 같은 값에 이른다는 일관성 모델. 그 사이에는 복제본마다 다른 값이 보일 수 있다
- 컨슈머 랙 (consumer lag)
- 파티션의 마지막 오프셋과 소비자가 커밋한 오프셋의 차이. 소비자가 얼마나 밀렸는지를 건수로 잰다
- 쿼럼 (quorum, 과반)
- 결정에 필요한 최소 동의 노드 수. 보통 과반(N/2+1)이고, 읽기·쓰기 쿼럼의 합이 N 을 넘으면 읽기가 최신 쓰기를 적어도 하나 본다
- 팬아웃 (fan-out, pub/sub)
- 한 메시지·쓰기를 여러 수신자에게 퍼뜨린다. Kafka 에서는 한 토픽을 컨슈머 그룹 여럿이 각자 끝까지 읽는 모양이고, 피드 설계에서는 쓸 때 퍼뜨릴지 읽을 때 모을지의 선택이다
- 포이즌 메시지 (poison pill, poison message)
- 계약을 어긴 페이로드처럼 몇 번을 다시 해도 실패하는 메시지. 그 자리에서 재시도만 반복하면 파티션 전체가 멈춘다
- CAP 정리 (CAP theorem, 브루어 정리)
- 네트워크 분할(P)이 일어나면 선형적 일관성(C)과 모든 요청에 대한 응답(A) 중 하나를 포기해야 한다는 정리. 분할이 없을 때의 선택은 말하지 않는다
- DLQ (dead letter queue, DLT, dead letter topic)
- 정해진 횟수만큼 재시도해도 처리하지 못한 메시지를 별도 토픽으로 옮겨 두고 다음 메시지로 넘어간다. 옮긴 메시지는 사람이 보거나 다시 흘린다
다른 분류