[More Kafka]3-2. 카프카 프로듀서 실습 추가

[More Kafka]3-2. 카프카 프로듀서 실습 추가


topic, key, value 를 지정하는 경우

topic: partition4
number of partitions: 4 number of replication factor: 3

보내는 시나리오

  • key를 지정해서 메세지를 연속적으로 전송
    • key: partitions
    • value: M1, M2, M3, M4
  • key를 지정하지 않고 메세지를 전송
    • key: null
    • value: M5

결과 미리보기

Codes

  • (1) key를 지정해서 메세지를 연속적으로 전송
Properties kafkaProps = new Properties();  
kafkaProps.put("bootstrap.servers", "kafka:9092,kafka:9093,kafka:9094");  
kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");  
kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");  
Producer<String, String> producer = new KafkaProducer<String, String>(kafkaProps);

ProducerRecord<String, String> record =  
         new ProducerRecord<>("partition4", "partitions", "M1");  // M2, M3, M4 를 보냄.
  producer.send(record, new DemoProducerCallback());  
  log.info("전송완료. record: {}", record);  
  producer.close();
}
  • 동일한 key 값의 경우에는 해시 알고리즘에 의해서 동일한 파티션으로 분류되어 적재가 된다.

  • (2) Cli에서 key값을 주지 않고 그대로 전송

    ➜  bin ./kafka-console-producer.sh --broker-list kafka:9092,kafka:9093,kafka:9094 --topic partition4
    > M5
    
➜  partition4-2 cat 00000000000000000000.log
:��Om���m�����������������M5%
  • 각 브로커의 파티션의 log 들을 찾아보니 partition2 에 분배된 것을 확인했다. (컨슈밍을 하면 metadata를 얻어서 해당 밸류의 파티션 정보를 알 수 있음.)
  • 라운드 로빈 방식에 의해서 적절하게 분배되어서 들어간다. (카프카 매니저에서 확인이 가능하다. )

번외(Spring cloud stream binder kafka 로 전송)

  • 코드참고 springkafka03
  • 이 후 위 프로듀서 코드에서 M6, M7을 순차적으로 보내며 파티션 분배를 검증해봄 M6 - partition-0, M7 partition-2 로 각각 따로 저장됨. ```bash ➜ partition4-0 cat 00000000000000000000.log ��7m�pKm�pK���������������${“partition”:”M6”}contentType$”application/json”0spring_json_header_typesD{“contentType”:”java.lang.String”}%

➜ partition4-2 cat 00000000000000000000.log :��Om���m�����������������M5�PK�~m���m������������������${“partition”:”M7”}contentType$”application/json”0spring_json_header_typesD{“contentType”:”java.lang.String”}% ```