1. 최대 한 번 전송 (at most once)
acks = 0으로 비동기로 전송만 한 번 수행, 유실될 수 있지만 재전송하지 않는 방법.
2. 적어도 한 번 전송 (at least once)
중복을 허용하며 실패시에도 retry로 재전송, acks = 1, all
브로커로부터 ACK를 받고 다음 메시지를 전송. 메시지 소실은 없지만 중복 전송을 할 수 있음.
데이터를 보낸 후, 저장 되었지만 ACK를 보내지 못한 경우 다시 보내게 되어 중복이 가능.
3. 정확히 한 번 전송 (exactly once)
중복 없이 전송(Idempotence, 멱등성), 메시지 전송 재시도 시 중복을 제거함
트랜잭션 기반의 전송.
Producer가 메시지를 전송할 때 프로듀서의 ID와 메시지 Sequence를 Header에 가지고 있어,
브로커에서는 브로커가 가지고 있는 메시지 Sequence보다 1만큼 더 큰 경우에만 브로커에 저장한다.
그래서 메시지가 중복될 경우 이를 메시지 로그에 기록하지 않는다.
이렇게 하기 위해서는,
enable.idempotence = true
acks = all
retries > 0
1 <= max.in.flight.requests.per.connection <= 5
이렇게 멱등성을 보장할 경우, 성능이 감소 (~20%) 할 수 있지만, 멱등성 적용을 권장한다.
최대 성능 20% 차이가 매우 클 수 있는 경우, 클러스터를 확장하거나 하는 방법이 있을 수 있다.
이러한 멱등성 보장 설정은 Kafka 3.0 이상 부터는 기본 설정으로 되어있다.
그러나 다른 파라미터를 잘못 설정 시, 적용되지 않는다. 다만 enable.idempotence=true를 설정하면
ConfigException이 발생하며 acks를 all로 설정하라는 에러와 함께 Producer가 기동되지 않는다.
즉 명확하게 enable 설정을 한 경우 Exception도 명확하게 나온다.
'Kafka' 카테고리의 다른 글
10. Kafka - Consumer 기본 메커니즘과 Rebalancing (0) | 2024.05.16 |
---|---|
9. Kafka - Producer 메커니즘 1 (0) | 2024.04.04 |
7. Kafka Producer 메시지 전송과 재전송 옵션 (1) | 2024.04.04 |
6. Kafka - Java Kafka Clients의 Send 메소드 (1) | 2024.04.04 |
5. Kafka - Kafka-Configs (0) | 2024.04.04 |