Data/Kafka
[Kafka] 멱등성/At least once/At most once/Exactly once
dev_ss
2023. 7. 1. 01:03
MSA(Micro Service Architecture)에서 EDD(Event Driven Development)를 기반으로 개발을 할 때 Kafka를 이벤트 브로커로 많이 사용하게 되고, 그와 더불어서 이슈가 되는 것이 멱등성에 관한 내용이다.
아래 글은 Kafka에서 멱등성과 관련된 내용을 다룬 것이다.
1. 멱등성(Idempotence) :
- 멱등성 : 동일한 요청이 여러 차례 반복되어 작업이 처리되어도 동일한 결과를 나타내는 특성
Kafka의 Producer와 Consumer가 Pull 방식으로 발생한 이벤트를 처리하는데,
여기서 Producer와 Consumer에서 메시지 유실 또는 메시지 중복 처리가 발생할 수 있고, 이는 멱등성을 보장하지 못한다.
2. At least once :
- at_least_once : 이벤트가 발생했을 때, 해당 이벤트가 최소 1번은 이벤트가 발행되어 처리되는 것을 보장을 한다는 의미
- 메세지메시지 유실을 방지하기 위해 중복으로 메시지를 처리하는 것을 허용하는 것
3. At most once :
- at_most_once : 이벤트가 발생했을 때, 최대 1번만 이벤트 메시지가 발행되게 한다는 의미
- 메세지 유실을 허용하고 중복으로 이벤트 처리를 방지하기 위한 것
4. Producer의 At least once / At most once :
- At most once : producer에서 offset을 먼저 지정하고 Kafka Broker에 메시지를 전달
- At least once : producer에서 Kafka Broker에 메시지를 전달을 확인받고 offset 지정
5. Consumer의 At least once / At most once :
- At most once : consumer에서 offset을 먼저 지정하고 Kafka Broker에 메시지를 전달
- At least once : producer에서 Kafka Broker에 메시지를 전달을 확인 받고 offset 지정
6. Exactly once
- exactly once :이벤트가 발생했을 때, 메시지가 유실 또는 중복이 없이 정확히 1번 처리된다는 의미
- 가장 구현 난이도가 높다
- Producer와 Consumer에서 발생되는 메시지 유실과 메시지 중복 처리를 모두 구현이 필요
- Kafka에서 기본적으로 at least once와 at most once는 간단한 설정으로 구현이 가능하나, exactly once는 추가적인 비즈니스 로직이 첨가되어야 한다.
6-1. Exactly once (Producer)
Spring boot에서는 아래 config 설정을 통해 Producer 측면에서의 멱등성을 보장할 수 있다.
- ACKS_CONFIG : 브로커의 Leader와 Follower가 메시지를 정확히 수신했는지 체크 (속도 저하 발생)
- 0 (default) : 메시지를 발행하고 브로커에 전달 여부는 체크하지 않음
- 1 : 카프카 브로커의 Leader가 발행한 메시지를 성공적으로 받았는지 체크
- all : 카프카 브로커의 Leader와 Follower까지 모두 메시지를 성공적으로 받았는지 체크
- ENABLE_IDEMPOTENCE_CONFIG : 메시지 발행 Acks 실패 시 Sequence number를 통한 중복 메시지 처리 설정
6-2. Exactly once (Consumer)
consumer 측면에서는 at least once를 기반으로 중복 메시지 처리 로직을 추가함으로써 멱등성을 구현할 수 있다.
아래는 그 예제이다.
DB에 메시지 자체의 고유 값을 저장하고 처리된 여부를 조회함으로써 중복 메시지 처리를 방지할 수 있게 된다.
반응형