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 :

[ 출처 : https://medium.com/techwasti/idempotent-kafka-consumer-442f9aec991e ]

  • At most once : producer에서 offset을 먼저 지정하고 Kafka Broker에 메시지를 전달
  • At least once : producer에서 Kafka Broker에 메시지를 전달을 확인받고 offset 지정

 

 

5. Consumer의 At least once / At most once :

[ 출처 : https://medium.com/techwasti/idempotent-kafka-consumer-442f9aec991e ]

  • At most once : consumer에서 offset을 먼저 지정하고 Kafka Broker에 메시지를 전달
  • At least once : producer에서 Kafka Broker에 메시지를 전달을 확인 받고 offset 지정

 

 

6. Exactly once

  • exactly once :이벤트가 발생했을 때, 메시지가 유실 또는 중복이 없이 정확히 1번 처리된다는 의미
  1. 가장 구현 난이도가 높다
    • Producer와 Consumer에서 발생되는 메시지 유실과 메시지 중복 처리를 모두 구현이 필요
  2. 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까지 모두 메시지를 성공적으로 받았는지 체크

[ 출처 : https://medium.com/@shesh.soft/kafka-idempotent-producer-and-consumer-25c52402ceb9 ]

 

 

  • ENABLE_IDEMPOTENCE_CONFIG : 메시지 발행 Acks 실패 시 Sequence number를 통한 중복 메시지 처리 설정

[ 출처 : https://medium.com/@shesh.soft/kafka-idempotent-producer-and-consumer-25c52402ceb9 ]

 

6-2. Exactly once (Consumer)

 

consumer 측면에서는 at least once를 기반으로 중복 메시지 처리 로직을 추가함으로써 멱등성을 구현할 수 있다.

 

아래는 그 예제이다.

[ 출처 : https://medium.com/@shesh.soft/kafka-idempotent-producer-and-consumer-25c52402ceb9 ]

 

DB에 메시지 자체의 고유 값을 저장하고 처리된 여부를 조회함으로써 중복 메시지 처리를 방지할 수 있게 된다.

반응형