본문 바로가기
Kafka

8. Kafka - Idempotence, 멱등성

by #Glacier 2024. 4. 4.
반응형

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도 명확하게 나온다.

반응형