최대 한번 전송, 적어도 한번 전송, 정확히 한번 전송
- 최대 한번 전송 (acks = 0)
- 적어도 한번 전송 (중복 허용, retries > 0, acks = 1 or all)
- 정확히 한번 전송
- 중복 없이 전송 : Producer의 message 전송 retry 시 중복 제거
- Transaction 기반 전송 : Consumer -> Process -> Producer (주로 Kafka Stream)에 주로 사용되는 Transaction 기반 처리
최대 한번 전송
- Producer는 브로커로부터 ack 또는 에러 메시지 없이 다음 메시지를 연속적으로 보낸다.
- 메시지가 소실 될 수는 있지만 중복 전송은 하지 않는다.
- acks = 0
최대 한번 전송 동작 메커니즘 #1
- 메시지 A가 정상적으로 브로커에 기록되고 Ack가 전송된다. (Producer가 Ack를 기다릴 필요는 없다)
- 메시지 B가 정상적으로 브로커에 기록되지 못하거나 브로커에 기록되었지만 네트워크 장애 등으로 Ack를 전송하지 못했다.
- 메시지 B가 정상적으로 브로커에 기록되었는지를 확인하지 않고 메시지 C를 전송한다. (메시지 B는 소실될 수 있다)
적어도 한번 전송
- Producer는 브로커로부터 Ack를 받은 다음에 다음 메시지 전송. 메시지 소실은 없지만 중복 전송을 할 수 있다.
- retries > 0, acks = 1 or all
적어도 한번 전송 동작 메커니즘 #1
- 메시지 A가 정상적으로 브로커에 기록되고 Ack가 전송된다. (Producer는 Ack를 기다린 후 메시지 B를 전송)
- 메시지 B가 정상적으로 브로커에 기록되었지만 네트워크 장애 등으로 Ack를 Producer에게 보내지 못했다.
- 메시지 B의 Ack를 받지 못한 Producer는 메시지 B를 다시 보낸다. (메시지 B는 중복 기록된다)
중복 없이 전송
- Producer는 브로커로부터 Ack를 받은 다음에 다음 메시지를 전송하되, Producer ID와 메시지 Sequence를 Header에 저장하여 전송한다.
- 메시지 Sequence는 메시지의 고유 Sequence 번호, 0부터 시작하여 순차적으로 증가한다. Producer ID는 Producer가 기동시마다 새롭게 생성한다.
- 브로커에서 메시지 Sequence가 중복 될 경우 이를 메시지 로그에 기록하지 않고 Ack만 전송한다.
- 브로커는 Producer가 보낸 메시지의 Sequence가 브로커가 가지고 있는 메시지의 Sequence보다 1만큼 큰 경우에만 브로커에 저장한다.
중복 없이 전송 동작 메커니즘 #1
- 메시지 A가 정상적으로 브로커에 기록되고 Ack가 전송된다. (메시지 A는 Producer ID:0, Sequence:0으로 브로커 메모리에 저장된다. Producer는 Ack를 기다린 후 메시지 B를 전송한다)
- 메시지 B가 정상적으로 브로커에 기록되었지만 네트워크 장애 등으로 Ack를 Producer에게 보내지 못한다. 메시지 B는 메시지 B는 Sequence 1로 브로커에 저장된다.
- 메시지 B의 Ack를 받지 못한 Producer는 메시지 B를 다시 보낸다. 메시지 B는 재전송 되었지만 브로커는 Sequence가 1인 메시지가 이미 저장되어 있기 때문에 해당 메시지를 메시지 로그에 저장하지 않고 Ack만 보낸다.
Idempotence를 위한 Producer 설정
- enable.idempotence=true
- acks=all
- retries>0
- 1<=max.in.flight.requests.per.connection<=5
- Idempotence 적용 후 성능이 약간 감소 (최대 20%)할 수 있지만 기본적으로 Idempotence 적용을 권장한다.
Idempotence 기반에서 메시지 전송 순서 유지 메커니즘
- B0, B1, B2 순으로 Producer에서 생성된 메시지 배치
- Idempotence 기반에서 max.in.flight.requests.per.connection 만큼 여러 개의 배치들이 브로커에 전송된다.
- 브로커는 메시지 배치를 처리 시 write된 배치의 마지막 메시지 Sequence + 1이 아닌 배치 메시지가 올 경우 OutOfOrderSequenceException을 생성하여 Producer에 오류로 전달한다.
- B0의 메시지 Sequence가 0~10, B1의 메시지 Sequence가 11~20, B2의 메시지 Sequence가 21~30이라고 가정한다면 B1 write 시 Failure가 발생하고 B2가 들어왔을 때 B0의 맨 마지막 Sequence + 1이 B2의 첫번째 메시지의 Sequence가 아니기 때문에 OutOfOrderSequenceException이 발생하게 된다.
Idempotence를 위한 Producer 설정 시 유의사항
- Kafka 3.0 버전부터는 Producer의 기본 설정이 Idempotence 이다.
- 하지만 기본 설정중에 enable.idempotence=true (default)를 제외하고 다른 파라미터들을 잘못 설정하면 (예를 들어, acks=1로 설정) Producer는 정상적으로 메시지를 보내지만 Idempotence로는 동작하지 않는다.
- 명시적으로 enable.idempotence=true를 설정한 뒤 다른 파라미터들을 잘못 설정하면 Config 오류가 발생하면서 Producer가 기동되지 않는다.
...
props.setProperty(ProducerConfig.ENABLE_DEMPOTENCE_CONFIG, "true");
props.setProperty(ProducerConfig.ACKS_CONFIG, "0");
...
docs.confluent.io 문서 확인
Kafka producer configuration reference | Confluent Documentation
Enter a string to search and filter by configuration property name. bootstrap.servers A list of host/port pairs used to establish the initial connection to the Kafka cluster. Clients use this list to bootstrap and discover the full set of Kafka brokers. Wh
docs.confluent.io
'kafka > core' 카테고리의 다른 글
Kafka Consumer 클래스의 주요 구성 요소와 poll() 메서드 동작 메커니즘 이해 (0) | 2025.05.14 |
---|---|
Consumer의 주요 메커니즘 개요 (0) | 2025.05.13 |
Producer의 max.inflight.requests.per.connection 파라미터와 배치 메시지의 전송 순서 이해 (0) | 2025.05.06 |
Producer의 전송/재전송 내부 메커니즘 및 전송 동작 관련 주요 파라미터의 이해 (0) | 2025.05.05 |
Producer의 동기(Sync)와 비동기(Async)에서 배치 전송 차이 (0) | 2025.05.04 |
댓글