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 # 커밋된 데이터만 읽기
출처
'Spring > Spring for Apache Kafka' 카테고리의 다른 글
[Spring for Apache kafka] Apache Kafka Streams Support (0) | 2025.05.09 |
---|---|
[Spring for Apache Kafka] Transactions (0) | 2025.05.08 |
[Spring for Apache Kafka] 3-3. Receiving Messages: Post-Processing (0) | 2025.05.07 |
[Spring for Apache Kafka] 3-2. Receiving Messages: @KafkaListener (0) | 2025.05.07 |
[Spring for Apache Kafka] 4. Application Events (0) | 2025.05.06 |