Spring/Spring for Apache Kafka

[Spring for Apache Kafka] Exactly Once Semantics

noahkim_ 2025. 5. 8. 17:32

1. Exactly Once Semantics

  • 읽기 → 처리 → 쓰기 과정이 정확히 한 번만 실행되는 것을 보장

 

2. 처리 흐름

컨슈머

  1. KafkaAwareTransactionManager를 리스너 컨테이너에 설정하면, 리스너 호출 전에 트랜잭션을 시작합니다.
  2. 리스너 내부에서 수행하는 KafkaTemplate 작업들은 트랜잭션에 참여합니다.
  3. 리스너가 정상적으로 처리하면,
    • producer.sendOffsetsToTransaction()를 호출해서 컨슈머 오프셋을 트랜잭션에 포함시킵니다.
    • 이후 트랜잭션을 커밋합니다.
  4. 리스너에서 예외가 발생하면,
    • 트랜잭션을 롤백하고,
    • 컨슈머는 오프셋을 다시 설정해서, 실패한 레코드를 다음 poll() 때 다시 읽어 재처리합니다

 

3. 셋팅

spring:
  kafka:
    producer:
      acks: all
      enable-idempotence: true
      transactional-id-prefix: my-tx-   # 꼭 설정해야 함!
    listener:
      ack-mode: record                  # 레코드 단위 커밋 (default)
      type: batch                        # (선택) 배치로 받고 싶으면 batch
    consumer:
      isolation-level: read_committed    # 커밋된 데이터만 읽기

 

 

출처