멱등성(Idempotence)은 특정 연산을 여러 번 수행해도 최초 한 번 수행한 이후의 결과가 변하지 않는 성질을 말한다. 이 개념은 주로 데이터베이스, API 설계, 메시지 시스템 등 다양한 컴퓨팅 영역에서 중요하게 다루어진다. 멱등성은 특히 분산 시스템과 네트워크 통신에서 핵심적인 역할을 하며, 중복 처리를 방지하여 시스템의 안정성과 데이터 일관성을 유지하는 데 기여한다.
카프카는 분산 스트리밍 플랫폼으로, 멱등성 프로세서를 통해 중복 메시지의 처리 없이 신뢰성 있는 데이터 전송을 보장한다. 멱등성 프로듀서는 중복 메시지가 전송되더라도 카프카에서는 단 한 번만 커밋되도록 함으로써 데이터의 중복을 방지한다.
🎈좋은 요청의 경우
별다른 문제 없이 메세지를 produce -> commit -> ack의 프로세스를 거침
🎈중복 요청의 경우
메시지가 commit 후 네트워크 에러로 인해 ack이 반환되지 않는다.
프로듀서는 같은 메시지를 재시도하게 되고, 카프카는 동일한 메시지를 중복으로 커밋할 수 있다.
멱등 프로듀서의 도입으로 이러한 중복 커밋을 방지할 수 있다.
카프카는 중복 요청을 감지하고, 중복 커밋을 수행하지 않는다.
멱등 프로듀서를 사용함으로써, 카프카는 안정적이고 견고한 메시지 파이프라인을 제공합니다. Kafka 0.11 버전부터는 멱등 프로듀서를 지원하며, Kafka 3.0.0 버전부터는 이 옵션이 기본적으로 활성화됩니다. 그러나 이전 버전에서는 수동으로 설정을 활성화해야 합니다. 관련 설정은 다음과 같습니다.
retries = Integer.MAX_VALUE // 최대 재시도 횟수
max.in.flight.requests.per.connection = 1 (Kafka 0.11)
or
max.in.flight.requests.per.connection = 5 (Kafka 1.0 이상, KAFKA-5494 참조)
acks = all // 모든 복제본에 대한 확인을 기다림
이 설정은 프로듀서가 시작된 후 자동으로 적용된다.
프로듀서 코드에 다음 설정을 추가하여 멱등성을 활성화할 수 있다.
producerProps.put("enable.idempotence", true);
Kafka 3.0 이후 버전에서는 기본 설정값만으로도 안전하다.
- acks = all(-1)
- enable.idempotent=true
Kafka 2.8 이전 버전에서는 기본 설정값이 아래와 같다.
acks = 1
enable.idempotent=false
3.0 버전 이하의 경우 clients를 업그레이드 하거나, 아래의 세팅을 적용하자.
// 확인 응답을 받기 전에 데이터가 제대로 복제되었는지 확인
acks=all // 모든 응답을 기다림
// 확인 응답을 받았을 때 최소한 두 개의 브로커가 데이터를 가지고 있어야 함을 보장
min.insync.replicas=2 // 브로커 또는 토픽 레벨에서 설정
// 네트워크 재시도로 인한 중복 메시지 발생을 방지
enable.idempotence=true // 멱등성 활성화
// delivery.timeout.ms에 도달할 때까지 재시도
retries=MAX_INT // 프로듀서 레벨
// 2분 동안 재시도한 후 실패로 처리
delivery.timeout.ms=12000 // 2분 동안의 타임아웃 설정
// 메시지 순서를 유지하면서 최대 성능을 보장
max.in.flight.requests.per.connection=5 // 동시에 처리되는 요청의 최대 수 설정
어떤 버전을 사용하든, 안전한 Producer 설정을 하기를 권장한다. 특히 데이터 손실을 방지하려면 말이다.
멱등 프로듀서의 중요성과 설정 방법에 대해 소개하였다.
데이터의 정확성과 시스템의 신뢰성을 높이기 위해 멱등성을 반드시 고려해야 한다.