2025년 1월 2일 작성
Message 전달 보증 수준 - 처리를 보장하는 3가지 방식
Message 전달 보증 수준은 Message Queue의 message 처리 보장 방식을 의미하며, 크게 At Most Once, At Least Once, Exactly Once 전달 방식이 있습니다.
Message/Event 전달 보증 수준 (Event Delivery Guarantees)
-
Message Queue의 message 처리 보장 방식은 크게 At Most Once(최대 1회), At Least Once(최소 1회), Exactly Once(정확히 1회) 전달 방식이 있으며, 이는 message 발행자(Producer)가 보낸 message를 수신자(Consumer)가 받을 때 몇 번이나 전달되는지를 보장하는 수준을 의미합니다.
-
각 방식은 사용 사례와 요구 사항에 따라 적절히 선택하여 사용해야 합니다.
- data의 중요도, system의 복잡성, 성능 요구 사항 등을 고려하여 결정하면 됩니다.
sequenceDiagram
participant p as Producer
participant q as Message Queue
participant c as Consumer
Note over p,c: At-most-once delivery
p->>q: Send Message
q->>c: Forward Message
Note right of c: Message might be lost
Note over p,c: At-least-once delivery
p->>+q: Send Message A
q->>+c: Forward Message A
c-->>-q: No Ack (timeout)
q->>+c: Retry Message A
c-->>-q: Ack
q-->>-p: Delivery Complete
Note right of c: Might receive duplicates
Note over p,c: Exactly-once delivery
p->>+q: Send Message (with ID)
q->>+c: Forward Message
c->>c: Check Message ID
c-->>-q: Ack with ID
q-->>-p: Delivery Complete
Note right of c: Deduplication based on ID
At-most-once (최대 한 번 전달)
flowchart TD
p[Producer] --> q[Queue]
q --> c[Consumer]
- message가 최대 1회만 전달되는 것을 보장하는 방식입니다.
- message가 한 번만 전송되며, 수신 확인을 하지 않습니다.
- 처리 속도가 빠르고 구현이 단순하지만, 메세지 손실 가능성이 있습니다.
-
message가 전달되지 않을 수 있으나, 중복 전달은 절대 발생하지 않습니다.
- data의 일부 손실이 허용되는 경우에 사용합니다.
- 실시간 monitoring data 처리, log 수집 system, 일시적인 data 손실이 허용되는 통계 system 등.
At-least-once (최소 한 번 전달)
flowchart TD
p[Producer] --> q[Queue]
q --> c[Consumer]
c -- No Ack --> q
q -- Retry --> c
- message가 반드시 1회 이상 전달되는 것을 보장하는 방식입니다.
- 수신 확인이 올 때까지 message를 계속 재전송합니다.
- network 장애나 system 오류 발생 시에도 message 전달을 재시도합니다.
- message 손실을 방지할 수 있고, 구현이 비교적 단순하지만, message를 중복 전달할 가능성이 있습니다.
- 중복 전달이 발생할 수 있으므로 수신자 측의 멱등성 처리가 필요합니다.
- 멱등성(idempotence) : 동일한 요청이 여러 차례 반복되어 작업이 처리되어도 동일한 결과를 나타내는 특성.
- 중복 전달이 발생할 수 있으므로 수신자 측의 멱등성 처리가 필요합니다.
- data 손실 방지가 중요하고 중복 처리가 가능한 경우에 사용합니다.
- 금융 거래 system, 주문 처리 system, 중요 event 알림 system 등.
Exactly-once (정확히 한 번 전달)
flowchart TD
p[Producer] --> |Message + ID| q[Queue]
q --> c[Consumer]
c --> |Check ID| dedup[Deduplication]
dedup --> |If new| process[Process Message]
dedup --> |If duplicate| skip[Skip Message]
process --> |Ack| q
skip --> |Ack| q
- message가 정확히 1회만 전달되는 것을 보장하는 가장 엄격한 방식입니다.
- message를 정확히 한 번만 전달합니다.
- message를 손실과 중복 없이 완벽히 전달할 수 있지만, 구현이 매우 복잡하고, 성능 overhead가 발생할 수 있습니다.
- Producer와 Consumer 모두 상태를 저장하여 관리합니다.
- data 손실 방지가 중요하고 중복 처리가 불가능한 경우에 사용합니다.
- message의 중복이나 누락이 심각한 문제를 일으킬 수 있는 상황에서 반드시 한 번만 처리되어야 하는 경우에 사용합니다.
- 결제 system, 계좌 이체 처리, 재고 관리, 법적 문서 처리 system 등.
Message 처리 보장을 위한 핵심 Mechanism
- message 처리 보장을 위해 여러 핵심적인 mechanism을 적용할 수 있습니다.
- Message 영속성 (Message Persistence) : message를 Disk에 저장.
- message를 Disk에 저장하여 system 장애 발생 시에도 data 손실을 방지합니다.
- Memory와 Disk를 적절히 활용하여 성능과 안정성의 균형을 유지합니다.
- 확인 응답 Mechanism (Acknowledgment) : message 수신 및 처리 완료 확인.
- message 수신 및 처리 완료를 명시적으로 확인합니다.
- 자동 확인(Auto-ACK)과 수동 확인(Manual-ACK) 방식을 상황에 따라 선택할 수 있습니다.
- 재시도 Mechanism (Retry Mechanism) : 실패 시 재시도.
- message 전달 실패 시 자동으로 재시도합니다.
- 재시도 횟수와 간격을 설정하여 system 부하를 조절할 수 있습니다.
- 실패 Message Queue (Dead Letter Queue) : 실패 message 별도 보관.
- 지속적인 처리 실패 message를 별도로 보관합니다.
- 문제 분석과 수동 개입을 위한 message 보관소 역할을 수행합니다.
- Transaction 관리 (Transaction Management) : data 일관성 보장.
- message 발행과 소비 과정에서 data 일관성을 보장합니다.
- 분산 transaction을 통해 여러 system 간의 작업을 원자적으로 처리합니다.