Yebali

Kafka Producer (카프카 프로듀서) 본문

Kafka

Kafka Producer (카프카 프로듀서)

예발이 2022. 1. 30. 22:30

카프카 프로듀서

프로듀서는 카프카에서 데이터를 저장하는 첫 단계이다.

프로듀서에는 데이터 유실을 막기 위한 다양한 옵션이 존재한다.

 

acks 옵션

이 옵션을 통해 프로듀서가 전송한 데이터가 카프카 클러스터에 얼마나 신뢰성 높게 저장할지 지정할 수 있다.
(아래 예시에서는 복제수가 2 이상인 경우에 대한 동작)

 

acks = 0

프로듀서가 리더 파티션으로 데이터를 전송했을 때, 리더 파티션으로 데이터가 저장되었는지 확인하지 않는다.

저장 여부에 대한 응답을 받지 않기 때문에 데이터가 몇 번째 오프셋에 저장되었는지 확인할 수 없다.

저장 여부를 알 수 없기 때문에 재시도를 하지 않는다.

 

acks = 1

리더 파티션에만 정상적으로 적재되었는지 확인한다. 정상적으로 적재되지 않는 경우 재시도할 수 있다.

팔로워 파티션에 데이터를 복제하기 직전에 리더 파티션이 장애가 나면 일부 데이터가 유실될 수 있다.

 

acks == all or -1

리더 파티션과 팔로워 파티션에 정상적으로 적재되었는지 확인한다.

일부 브로커에 장애가 발생하더라도 안전하게 데이터를 전송하고 저장할 수 있음을 보장한다.

min.insync.replicas옵션에 따라 ISR내에 몇 개의 팔로워 파티션에 정상적으로 적재되었는지를 확인할지 정할 수 있다.

  • min.insync.replicas = 1 이면 acks = 1 와 같은 동작을 한다.
  • min.insync.replicas = 3이고 파티션의 수가 3일 때, 브로커 하나가 고장 나면 Error가 발생한다.
    그러므로 토픽 별 min.insync.replicas옵션 값은 브로커 개수 미만으로 설정해서 운영해야 한다.

토픽 복제 수 = 3, min.insync.replicas = 2, acks = all을 권장한다.

 

멱등성 프로듀서

동일한 데이터를 여러 번 전송하더라도 카프카 클러스터에 단 한 번만 저장됨을 의미한다.
프로듀서의 기본 동작은 '적어도 한번 전달'이기 때문에 중복이 발생할 수 있다.

프로듀서에서 enable.idempotence옵션을 통해 '정확히 한번 전달'하는 멱등성 프로듀서로 동작하도록 할 수 있다.

멱등성 프로듀서는 브로커로 PID(Producer unique ID)와 시퀀스 넘버를 함께 전달한다.
브로커는 PID와 시퀀스 넘버를 확인하여 같은 데이터는 단 한 번만 적재한다.

enable.idempotence를 true로 설정하면, retries는 INT_MAX로 설정되고, acks옵션은 all로 설정된다.

 

트랜잭션 프로듀서

다수의 파티션에 데이터를 저장할 경우 모든 데이터에 대해 동일한 원자성을 만족시키기 위해 사용된다.
원자성을 만족한다는 것은 다수의 데이터를 동일 트랜잭션으로 묶어, 전체 데이터를 처리하거나 전체 데이터를 처리하지 않음을 의미한다.

트랜잭션 프로듀서는 레코드 외에 트랜잭션의 끝을 표현하기 위해 트랜잭션 레코드를 한 개 더 보낸다.
트랜잭션 레코드는 레코드의 특성을 가지기 때문에 오프셋을 한 개 차지한다.

컨슈머는 기본적으로 데이터가 파티션에 쌓이는 대로 모두 가져가서 처리한다.
하지만 트랜잭션 컨슈머는 커밋이 완료된 데이터만 가져간다.