Spring/Spring for Apache Kafka
[Spring for Apache Kafka] Exactly Once Semantics
noahkim_
2025. 5. 8. 17:32
1. Exactly Once Semantics
- 읽기 → 처리 → 쓰기 과정이 정확히 한 번만 실행되는 것을 보장
2. 처리 흐름
컨슈머
- KafkaAwareTransactionManager를 리스너 컨테이너에 설정하면, 리스너 호출 전에 트랜잭션을 시작합니다.
- 리스너 내부에서 수행하는 KafkaTemplate 작업들은 트랜잭션에 참여합니다.
- 리스너가 정상적으로 처리하면,
- producer.sendOffsetsToTransaction()를 호출해서 컨슈머 오프셋을 트랜잭션에 포함시킵니다.
- 이후 트랜잭션을 커밋합니다.
- 리스너에서 예외가 발생하면,
- 트랜잭션을 롤백하고,
- 컨슈머는 오프셋을 다시 설정해서, 실패한 레코드를 다음 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 # 커밋된 데이터만 읽기
출처