분산 시스템 용어집

분산 시스템 분야의 개념 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)
정해진 횟수만큼 재시도해도 처리하지 못한 메시지를 별도 토픽으로 옮겨 두고 다음 메시지로 넘어간다. 옮긴 메시지는 사람이 보거나 다시 흘린다

다른 분류