1. 전달 보증 수준
종류 | 개요 | 재전송 유뮤 | 중복 삭제 유무 | 비고 |
---|
At Most Once | 1회는 전달을 시도 해본다 | X | X | 메시지는 중복되지 않지만, 상실될 수도 있다. |
At Least Once | 적어도 1회는 전달한다. | O | X | 메시지가 중복될 가능성은 있지만, 상실되지는 않는다. |
Exactly Once | 1회만 전달한다. | O | O | 중복되거나 상실되지 않고 확실하게 메시지가 도달하지만, 성능이 나오기 힘들다. |
2. Kafka에서 At Least Once 실현
2-1. Ack
- broker가 메시지를 수신했을 때, producer에게 수신 완료했다는 응답.
2-2. Offset Commit
- consumer가 수신한 메시지를 정상 처리했다면 처리(수신) 완료 기록을 broker에게 보내는 것.
- Offset commit은 메시지를 받아 정상적으로 처리를 완료한 다음 offset을 업데이트함으로써 어딘가 잘못된 문제로 메시지를 재전송할 때 어디부터 재전송하면 되는지 판단할 수 있다.
데이터가 중복될 가능성이 있다. 따라서 애플리케이션에서 메시지 중복 처리가 필요함.
3. Kafka에서 Exactly Once 실현
- 트랜잭션 개념을 도입하여 전달을 보증.
- 쌍방간의 실현이 모두 필요한데, producer와 broker 상호 교환 사이, broker와 consumer 상호 교환 사이에서 필요함.
- 오버헤드가 존재한다. 따라서 처리량 감소를 감수해야 함.
3-1. producer와 broker 사이
- 양쪽 모두에서 시퀀스 번호를 관리해 중복되는 실행을 제거하는 방법을 사용.
- producer가 broker로 메시지 송신
- broker에서 받은 메시지 기록
- 특정 이유로 Ack가 반송 실패(메시지는 broker에 정상 기록됨)
- producer에서는 송신 실패로 판단, 메시지 재전송
- broker는 이미 받은 메시지로 판단, 기록하지 않음
- Ack가 정상적으로 producer에게 반환됨
-> 중복 메시지를 제거할 수 있다.
3-2. broker와 consumer 사이
- kafka broker에는 트랜잭션의 범위를 해석하고, 트랜잭션 중단 시 중단까지의 처리를 파기하는 기능이 있음.
- 트랜잭션 시작
- consumer에서 메시지 수신
- 수신한 메시지 처리
- 처리 결과를 broker에 송신
- consumer에서 수신한 메시지의 offset을 commit
- 특정 이유로 트랜잭션 abort/timeout
- broker에서는 2-5 과정의 처리를 파기.
출처
사사키 도루, 『실전 아파치 카프카』, 정인식, 한빛미디어(2020)