#Producer Sample Code(Serializer)
#Key와 Value용 Serializer를 각각 설정
private Proerties props = new Prolerties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "broker101:9092, broker102:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, org.apache.kafka.commom.serializtion.StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, io.confluent.kafka.serializers.KafkaAvroSerializer.class);
KafkaProducer producer = new KafkaProducer(props);
- 메시지를 Topic의 어떤 Partition으로 보낼지 결정한다
- 전제 조건은 Key가 null이 아니어야 한다
Apache Kafka Producer Improvement with the Sticky Partitioner*
- Kafka2.4 이전의 DefaultParitioner는 Round Robin 정책으로 동작
- Kafka2.4 이후의 DefaultParitioner는 Sticky 정책으로 동작 하나의 Batch가 닫힐 때까지 하나의 partition에게 record를 보내고 랜덤으로 Partition을 선택하는 방식으로 동작
- Consumer는 각각 고유의 속도로 Commit Log로 부터 순서대로 Read(Poll)를 수행
- 다른 Consumer Group에 속한 Consumer들은 서로 관련이 없으며, Commit Log에 있는 Event(Message)를 동시에 다른 위치에서 Read 할 수있음
- Consumer는 자동이나 수동으로 데이터를 읽은 위치를 commit하여 다시 읽음을 방지
- __consumer_offset이라는 Internal Topic에서 Consumer Offset을 저장하여 관리
- 4개의 파티션이 있는 Topic을 consume하는 4개의 Consumer가 하나의 Consumer Group에 있다면, 각 Consumer는 정확히 하나의 Partition에서 Record를 consume함
- Parition은 항상 Consumer Group내의 하나의 Consumer에 의해서만 사용됨
- Consumer는 주어진 Topic에서 0개 이상의 많은 Partition을 사용할 수 있음
Consumer Rebalancing
- Consumer Group에 속해 있는 Consumer가 죽는 경우, 그 그룹에 속해 있는 Consumer들은 Parition을 분해하여 consume함
- Partition은 항상 Consumer Group내의 하나의 Consumer에 의해서만 사용
- Consumer는 주어진 Topic에서 0개 이상의 많은 Partition을 사용할 수 있음
- 동일한 group.id로 구성된 모든 Consumer들은 하나의 Consumer Group을 형성
- Consumer Group의 Consumer들은 작업량을 어느 정도 균등하게 분할함
- 동일한 Topic에서 consume하는 여러 Consumer Group이 있을 수 있음
- 다른 Consumer Group의 Consumer들은 분리되어 독립적으로 작동