Producer는 메시지를 카프카 topic으로 보내는 도구이다.
producer option
키 | 용도 |
---|---|
bootstrap.servers | 시작 시 연결할 하나 이상의 카프카 브로커 |
acks | 메시지 전달이 성공하기 위한 producer가 요구하는 복제 확인 (acknowledgement)의 수 |
key.serializer | 키의 직렬화에 사용되는 클래스 |
value.serializer | 값의 직렬화에 사용되는 클래스 |
bootstrap servers
producer는 할당된 파티션의 leader replica에만 쓸 수 있는데, topic과 bootstrap.servers 밖에 모르기 때문에 알고있는 server에 연결한다. producer는 boootstrap.servers를 시작점으로 사용해 모든 후속 쓰기에 사용하는 브로커와 파티션에 대한 메타데이터를 가져온다.
각 브로커들은 클러스터 안의 다른 브로커들도 알고 있기 때문에 producer는 하나의 브로커를 통해 leader를 찾을 수 있다.
acks
acks는 producer가 완료를 받기 전에 partition leader가 follower(replica)로 부터 얼마나 많은 ack를 받아야 하는지에 대한 속성이다.
이 값은 all, -1, 1, 0을 가질 수 있다.
acks 0
acks가 0인 경우 0개의 replica에 ack를 받기 때문에 가장 적은 대기 시간을 얻을 수 있지만 안전한 배달을 보장하진 않는다.
acks all
acks가 all 혹은 -1인 경우 leader replica가 모든 replica 들의 ack를 기다린다는 의미이다.
따라서 가장 느린 대기 시간을 갖게 되지만 안전한 배달을 보장한다.
acks 1
acks가 1인 경우 1개의 replica에 ack를 받는다.
즉 leader replica의 수신을 확인하기 때문에 비교적 적당한 안정성과 대기시간을 가질 수 있다.
leader가 follower에게 복사본을 만드는 사이에 다운된다면 메시지를 누락할 수 있다.
serializer
카프카의 메시지는 byte array로 저장되기 때문에 serializer가 필요하다.
producer의 serializer와 맞는 consumer의 deserializer가 필요하다.
StringSerializer
, IntegerSerializer
와 같이 기본 제공되는 serializer들이 있으며, customSerializer를 만들 수도 있다.
여기서 key가 같으면 동일한 partition으로 전송한다.
- partition 수가 늘어나면 다른 partition으로 갈 수도 있다.
- key가 null 인 경우 사용 가능한 partition 중 랜덤으로 선택한다.
timestamp
최신 버전의 producer에서는 event에 대한 timestamp가 포함되어 있다.
message.timestamp.type
을 CreateTime
으로 설정하면 사용자가 직접 작성하거나 현재 시스템 시간으로 전달할 수 있다.
LogAppendTime
으로 설정하면 브로커 시간이 사용된다.
메시지 전달이 실패하여 재시도 할 수 있기 때문에, 브로커의 시간을 사용할지 producer의 시간을 사용할지 서비스 특성에 맞게 판단해야 한다.
reference
- Kafka In Action 4장