메시지 큐는 비동기 연결 장치가 아니라, 어떤 사건을 얼마나 오래 보관하고 누구에게 어떤 순서와 중복 가능성으로 전달할지를 정하는 운영 계약입니다.
운영자 직접 작성·기술 검토·최종 검토 2026.08.29
개념 이해전달 보장장애 대응운영 관점진도 저장
≋
30초 핵심 요약
파티션 복제 로그와 Consumer Group은 순서 범위와 재전달을 관리합니다. 업무 효과는 event ID 원장과 상태 변경을 한 transaction에 묶고, 외부 API는 idempotency와 reconciliation으로 닫습니다. broker 성공을 전체 exactly-once로 확대하지 않습니다.
병렬성 단위Partition + key
내구성 단위Replica acknowledgement
업무 중복 방지Idempotent effect
DESIGN DECISION · 설계 판단
broker 전달과 외부 업무 효과의 정확성 경계를 어디에서 나눌 것인가?
예시 피크 유입약 29,200 events/s
계산 결과
예시 레코드 크기평균 1.2KB
설계 가정
예시 보존 기간7일
설계 가정
최종 선택
파티션 복제 로그 + at-least-once + effect ledger
업무 key로 파티션 순서를 정하고 Consumer Group이 offset을 관리합니다. 재전달은 허용하되 event ID 원장과 상태 변경을 한 transaction으로 묶고 외부 API는 idempotency와 reconciliation으로 닫습니다.
선택 이유
broker offset과 업무 상태의 성공을 같은 것으로 오인하지 않습니다.
consumer 중단과 rebalance 뒤 같은 event를 안전하게 다시 읽을 수 있습니다.
외부 provider timeout의 모호한 결과를 별도 대사할 수 있습니다.
포기한 대안
broker exactly-once 설정만으로 외부 효과까지 한 번 보장
broker transaction 밖의 데이터베이스·결제·이메일 provider는 같은 원자 경계에 포함되지 않습니다.
감수한 단점
effect ledger와 idempotency key의 저장·정리 비용이 듭니다.
파티션 밖 전역 순서는 제공하지 않습니다.
DLQ·replay 전에 schema와 비가역 효과를 검토해야 합니다.
01 · REQUIREMENTS
생산자와 소비자의 속도·장애를 분리한다
# 요구사항
분산 메시지 큐의 첫 질문은 “어떤 제품을 쓸까”보다 “어떤 업무 객체의 순서가 필요한가, 중복과 유실을 어디까지 허용하는가”입니다. 주문·결제·색인·분석은 모두 비동기일 수 있지만 같은 보장을 요구하지 않습니다.
R1안정된 사건 ID
생산자 재시도와 relay 중복을 견디도록 event_id를 모든 경계에 보냅니다.
R2명시적인 key
order_id처럼 순서를 원하는 업무 객체를 key로 정하고 hot key를 측정합니다.
R3독립 Consumer Group
결제 후속 처리와 분석이 서로의 lag·장애에 끌려가지 않게 나눕니다.
R4설명 가능한 복구
offset reset, retry, DLQ, replay의 범위와 승인 경로를 남깁니다.
02 · HIGH-LEVEL DESIGN
복제 로그와 업무 효과 저장소를 분리한다
# 아키텍처
outbox는 업무 변경과 publish 요청 사이의 누락을 줄이고, broker cluster는 파티션별 로그와 replica를 유지합니다. Consumer Group은 처리 병렬성을 얻지만 외부 API 호출·DB 갱신은 별도의 멱등 경계가 필요합니다.
분산 메시지 큐의 발행·복제·소비 경로 SVG DIAGRAM · outbox / partition / replica / consumer group
경계: 큐는 작업을 전달하고 보관하는 계층입니다. 비가역적인 업무 효과는 event_id와 도메인 고유 제약으로 보호하며, broker의 acknowledgement를 사용자 업무 성공과 같은 뜻으로 쓰지 않습니다.
03 · CONTRACT
메시지 envelope와 업무 효과의 식별자를 분리한다
# 계약
publish API의 수락, broker의 복제 acknowledgement, consumer의 업무 완료는 서로 다른 상태입니다. timeout 뒤 중복 발행될 수 있으므로 생산자와 relay는 같은 event_id를 유지하고, 소비자는 그 ID를 업무 멱등 키로 전달합니다.
데이터
주요 필드
제약·역할
outbox_event
event_id, aggregate_id, type, payload, created_at
UNIQUE(event_id); 업무 변경과 함께 기록하는 발행 원장
message envelope
event_id, topic, key, headers, schema_version
partition·offset과 연결되는 전달 메타데이터
consumer_effect
consumer_name, event_id, effect_state
UNIQUE(consumer_name,event_id); 외부 효과 중복 방지 경계
dead_letter
original_ref, failure_class, first_seen
격리·분석·명시적 재처리의 근거
스키마: schema version은 payload 안의 선택 사항이 아니라 소비 계약입니다. 필드 추가·기본값·삭제·폐기 시점의 호환성 규칙을 정하고, 같은 event_id에 다른 의미의 payload가 오면 조용히 덮어쓰지 않습니다.
04 · FLOW
발행, 처리, 진행 위치를 독립적으로 확인한다
# 흐름
타임아웃은 실패가 아니라 결과를 모르는 상태일 수 있습니다. 따라서 publish와 consume 모두 “다시 시도했을 때 같은 업무 결과가 안전한가”를 먼저 설계합니다.
01업무 + outbox
상태 변경과 event_id를 같은 원장에 기록해 발행 누락을 줄입니다.
02keyed publish
relay가 topic, key, schema version을 정하고 acknowledgement를 기다립니다.
03partition append
broker는 key가 정한 파티션의 로그와 replica 상태를 관리합니다.
04idempotent effect
consumer가 effect ledger 또는 외부 멱등 키로 중복을 먼저 막습니다.
05commit / recover
effect 뒤 offset을 진행시키고, 실패·재시작은 재처리 규칙으로 설명합니다.
05 · PARTITIONING
순서는 전역이 아니라 key가 정한 파티션 범위다
# 파티션
하나의 Consumer Group에서 파티션 하나는 정상적인 할당 상태에서 한 consumer가 맡습니다. 이는 객체별 순서를 해석하기 좋은 기반이지만, 여러 파티션·여러 topic·외부 effect를 합친 전역 총순서는 아닙니다.
선택
얻는 것
위험·검증
운영 신호
order_id key
같은 주문의 상태 전이를 한 partition 순서로 읽기 쉬움
초대형 주문·retry가 hot partition을 만들 수 있음
partition별 bytes, lag, key skew
customer_id key
사용자별 제한·순서 적용이 단순
한 고객의 burst가 다른 고객을 지연
tenant별 처리량, oldest age
무작위 key
쓰기 분산과 병렬성이 큼
업무 객체 순서 보장 불가
재정렬 필요 비율
partition 증설
처리량·consumer 병렬성 증가
key mapping 변경, rebalance, 파일·연결 비용
assignment 안정 시간
복제의 의미: replica는 leader 손실 뒤 확정 데이터를 복구하는 장치입니다. 몇 개 replica의 확인을 성공으로 볼지는 가용성과 RPO의 선택이며, 선택한 broker의 quorum·minimum replica 설정과 실제 failover 시험으로 확인합니다.
06 · DELIVERY SEMANTICS
at-least-once 전달과 업무 exactly-once를 분리한다
# 전달 보장
consumer가 DB에 결제 후속 상태를 기록한 직후 process가 죽고 offset commit 전에 멈추면, 재시작 때 같은 메시지를 다시 읽을 수 있습니다. 이 중복은 broker의 결함이 아니라 at-least-once 경계에서 예상해야 하는 상황입니다.
1×효과 멱등성
UNIQUE(consumer_name,event_id) 또는 수신 API idempotency key로 효과를 한 번만 적용합니다.
poison message, 비호환 schema, 권한 오류를 원인·만료와 함께 격리합니다.
RPL승인 replay
원인을 고친 뒤 topic·partition·시간 범위·consumer를 제한해 재처리합니다.
backlog가 커졌다고 consumer 수만 늘리면 DB·외부 API를 더 세게 압박하거나 rebalance를 자주 일으킬 수 있습니다. DLQ 전체를 이유 없이 일괄 재발행하는 것도 장애를 증폭시킬 수 있으므로 retry budget과 재처리 승인을 운영 계약으로 둡니다.
08 · FAILURE MODES
장애마다 유실·중복·지연을 따로 검증한다
# 장애
!leader 손실·replica 지연
leader election과 replica lag로 produce 실패·지연 또는 낮은 RPO 여유가 발생합니다.
대응 under-replicated partition을 경보로 두고, 복구 뒤 확정 offset 연속성·replica lag를 확인합니다.
↻effect 뒤 commit 전 중단
같은 event가 재전달되어 이메일·외부 요청·DB 갱신이 중복될 수 있습니다.
대응 effect ledger와 idempotency key로 이미 적용됨을 안전한 성공으로 처리합니다.
×poison message·schema 불일치
deserialize 오류가 하나의 파티션 처리와 consumer lag를 막습니다.
대응 제한 retry 뒤 DLQ로 격리하고 schema·producer 계약을 수정한 뒤 승인 replay합니다.
⌛느린 외부 의존성
결제·메일 API 지연이 consumer concurrency를 잡아먹고 retention 창을 위협합니다.
대응 circuit breaker, concurrency cap, retry topic을 쓰고 backlog drain 속도를 검증합니다.
⇄rebalance storm
member churn과 heartbeat timeout이 assignment를 반복해 중단·중복 가능성을 키웁니다.
대응 배포를 단계화하고 poll·heartbeat 경계를 조정하며 assignment 안정 시간을 관찰합니다.
⊘권한·자격 증명 오류
publish/consume이 멈추거나 넓은 ACL이 민감 topic 노출을 만들 수 있습니다.
대응 주체별 최소 권한, 키 회전, audit을 적용하고 허용 밖 접근 0건을 확인합니다.
09 · SECURITY
이벤트 로그를 데이터 복제면으로 취급한다
# 보안
이벤트는 broker, replica, consumer, archive, DLQ에 복제되고 재처리될 수 있습니다. 따라서 “내부 메시지”라고 본문·권한·감사를 느슨하게 두면 안 됩니다.
IDservice identity
producer, consumer, 운영자를 분리하고 일상 처리에 shared admin을 쓰지 않습니다.
ACLtopic·group 최소 권한
publish·consume·offset reset·DLQ replay 권한을 별도로 제한합니다.
PII참조 우선 payload
비밀번호·token·원본 카드 정보 대신 안전한 reference와 좁은 조회를 사용합니다.
추적: trace에는 event_id, topic, partition, offset, group, schema version을 넣고 payload 전체·인증 토큰은 제외합니다. 평균 lag가 정상이어도 한 hot partition의 오래된 레코드가 업무 SLO를 깨뜨릴 수 있습니다.
outbox에서 topic·partition 복제 로그로 발행하고 Consumer Group이 독립 offset을 가진다.
순서는 파티션 범위이며 partition 밖의 전역 총순서를 약속하지 않는다.
effect ledger와 상태 변경을 원자적으로 묶고 외부 API에는 idempotency·reconciliation을 추가한다.
lag·retention headroom·DLQ 원인·replay 결과를 같은 업무 효과로 대사한다. 이번 선택: 파티션 복제 로그와 at-least-once 소비를 사용하되, 업무 효과는 별도 멱등 원장으로 닫는다. 깨지는 신호: offset은 전진했지만 effect가 없거나 같은 event ID가 두 번의 비가역 결과를 만든다. 다음 검증: consumer 중단·rebalance·provider timeout을 주입해 중복률과 reconciliation 완료 시간을 측정한다.
INTERVIEW ↔ PRACTICE · 면접과 실무의 차이
전달 보장 범위를 설명하고 업무 효과 재처리를 운영하기
INTERVIEW · 면접
at-least-once broker 전달과 업무 exactly-once를 한 문장으로 구분합니다.