kafka - Idempotent(멱등) Producer

연어는결국강으로·2024년 2월 29일
0

Kafka

목록 보기
1/1
post-thumbnail

1. 멱등성은 무엇인가

멱등성(Idempotence)은 특정 연산을 여러 번 수행해도 최초 한 번 수행한 이후의 결과가 변하지 않는 성질을 말한다. 이 개념은 주로 데이터베이스, API 설계, 메시지 시스템 등 다양한 컴퓨팅 영역에서 중요하게 다루어진다. 멱등성은 특히 분산 시스템과 네트워크 통신에서 핵심적인 역할을 하며, 중복 처리를 방지하여 시스템의 안정성과 데이터 일관성을 유지하는 데 기여한다.

2. 카프카와 멱등성 프로세서 소개

카프카는 분산 스트리밍 플랫폼으로, 멱등성 프로세서를 통해 중복 메시지의 처리 없이 신뢰성 있는 데이터 전송을 보장한다. 멱등성 프로듀서는 중복 메시지가 전송되더라도 카프카에서는 단 한 번만 커밋되도록 함으로써 데이터의 중복을 방지한다.

🎈좋은 요청의 경우
별다른 문제 없이 메세지를 produce -> commit -> ack의 프로세스를 거침

🎈중복 요청의 경우
메시지가 commit 후 네트워크 에러로 인해 ack이 반환되지 않는다.
프로듀서는 같은 메시지를 재시도하게 되고, 카프카는 동일한 메시지를 중복으로 커밋할 수 있다.

  • 여기서 ack는 응답(acknowledgement)의 약자임.

멱등 프로듀서의 도입으로 이러한 중복 커밋을 방지할 수 있다.

카프카는 중복 요청을 감지하고, 중복 커밋을 수행하지 않는다.

멱등 프로듀서를 사용함으로써, 카프카는 안정적이고 견고한 메시지 파이프라인을 제공합니다. 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);

3. 안전한 Producer 설정

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 설정을 하기를 권장한다. 특히 데이터 손실을 방지하려면 말이다.

3. 결론

멱등 프로듀서의 중요성과 설정 방법에 대해 소개하였다.
데이터의 정확성과 시스템의 신뢰성을 높이기 위해 멱등성을 반드시 고려해야 한다.

0개의 댓글