인프라/Kafaka
kafka의 EOS란 무엇인가
물에서육지로
2024. 12. 10. 16:35
Kafka에서 EOS (Exactly-Once Semantics)는 메시지 처리의 정확히 한 번 보장(Exactly Once Guarantee)을 의미합니다. 이는 Kafka에서 메시지의 송수신 및 처리가 중복 없이 정확히 한 번 이루어지도록 보장하는 기능입니다.
기본적으로 메시징 시스템에서 세 가지 전송 보장 수준이 제공됩니다:
- At Most Once: 메시지가 한 번 이하로 전달됩니다. (유실 가능성 있음)
- At Least Once: 메시지가 적어도 한 번 전달됩니다. (중복 가능성 있음)
- Exactly Once: 메시지가 정확히 한 번 전달됩니다. (가장 엄격한 보장)
Kafka는 기본적으로 At Least Once 전달 보장을 제공하지만, 추가 설정을 통해 Exactly Once Semantics (EOS)를 구현할 수 있습니다.
Kafka에서 EOS의 동작 원리
- Idempotent Producer:
- Kafka Producer는 동일한 메시지를 여러 번 보냈더라도 Broker가 이를 중복 없이 정확히 한 번만 처리하도록 합니다.
- 이를 위해 Producer는 메시지에 고유한 Sequence Number를 포함하여 Broker에 전송합니다.
- Transactions:
- Kafka는 메시지 송수신과 처리 과정을 트랜잭션으로 묶어 원자성을 보장합니다.
- Producer는 여러 파티션에 메시지를 보낼 때 트랜잭션을 통해 메시지가 모두 성공적으로 기록되거나 모두 롤백되도록 보장합니다.
- Consumer Offset Commit:
- EOS를 지원하는 Kafka Consumer는 메시지 처리를 완료한 후 정확히 한 번만 Offset을 커밋합니다.
- 이 과정에서 중복 처리나 유실이 발생하지 않습니다.
Kafka에서 EOS 활성화 방법
- Enable Idempotent Producer:
- enable.idempotence=true로 설정하여 중복 방지 기능 활성화.
- Enable Transactions:
- Producer에 트랜잭션을 활성화하려면 transactional.id를 설정합니다.
transactional.id=your_transaction_id
- 트랜잭션 ID는 고유해야 하며, Kafka 클러스터는 이 ID를 기반으로 트랜잭션을 관리합니다.
- Producer에 트랜잭션을 활성화하려면 transactional.id를 설정합니다.
- Consumer Settings:
- EOS를 보장하려면 Consumer도 isolation.level=read_committed로 설정해야 합니다.
- 이 설정은 커밋된 메시지만 읽도록 제한합니다.
- EOS를 보장하려면 Consumer도 isolation.level=read_committed로 설정해야 합니다.
EOS가 중요한 이유
- 금융 서비스: 메시지가 중복으로 처리되면 거래가 중복될 위험이 있음.
- 데이터 파이프라인: 중복 데이터는 데이터 품질에 악영향을 미침.
- 분산 트랜잭션: 여러 파티션, 토픽, 데이터베이스 간의 데이터 일관성을 보장해야 할 때 필요.
EOS의 단점
- 성능 오버헤드: 트랜잭션 관리와 중복 방지 처리로 인해 처리 속도가 느려질 수 있음.
- 구성 복잡성: 설정과 관리가 더 복잡하며 트랜잭션 ID를 적절히 관리해야 함.
- 클라이언트 제한: EOS는 Kafka Java Client에서만 완전히 지원되며, 일부 언어에서는 EOS를 지원하지 않을 수 있음.
Kafka의 EOS는 고성능 데이터 스트리밍 환경에서 정확한 데이터 전달과 처리를 보장하려는 경우에 매우 유용한 기능입니다.