카프카 producer key
CompletableFuture<SendResult<Integer, String>> future = kafkaTemplate.send(MSG_TOPIC, key, msg.getMsg());
future.whenComplete((result, ex) -> {
System.out.println("future : " + result.getProducerRecord().value());
});
producer에 key가 있을 수도 있고 없을 수도 있다.
있다면 그 key로 해시값을 만들어 동일한 key라면 동일한 partition에 메세지를 전송할 수 있고
없으면 메세지를 라운드로빈으로 적절히 파티션들에 분산시키는 듯 하다.
Consumer partition
@Bean
public NewTopic messageTopic() {
return TopicBuilder.name(MSG_TOPIC)
.partitions(10)
.replicas(1)
.build();
}
partition은 10개로 구성하고
@KafkaListener(id = "foo", topics = MSG_TOPIC, clientIdPrefix = "myClientId", topicPartitions =
{ @TopicPartition(topic = MSG_TOPIC, partitionOffsets = @PartitionOffset(partition = "0-9", initialOffset = "0"))}
)
public void listen(ConsumerRecord<Integer, String> record) {
System.out.println(record);
}
컨슈머에서 key에 따른 partition이 어떻게 들어갔는지 확인해보자.
ConsumerRecord(topic = MESSAGE_TOPIC, partition = 3, leaderEpoch = 0, offset = 1, CreateTime = 1693732009669, serialized key size = 4, serialized value size = 4, headers = RecordHeaders(headers = [RecordHeader(key = __TypeId__, value = [106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103])], isReadOnly = false), key = 4, value = "hi")
ConsumerRecord(topic = MESSAGE_TOPIC, partition = 3, leaderEpoch = 0, offset = 0, CreateTime = 1693732002044, serialized key size = 4, serialized value size = 4, headers = RecordHeaders(headers = [RecordHeader(key = __TypeId__, value = [106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103])], isReadOnly = false), key = 2, value = "hi")
위와 같은 로그를 볼 수 있다.
key=2 와 key=4 가 같은 partition으로 전송된 것을 볼 수 있다.
물론 partition 개수보다 key 개수가 많아지면 당연히 다른 key에 같은 partition으로 가는 해시값이 나오겠지만 partition 수보다 적은 key를 사용할 때도 같은 해시값이 나올 수 있는 걸 주의하자.
특정 key가 독점적으로 partition을 사용하도록 하는 것이 아니라 동일 key라면 같은 partition을 통해 전송할 수 있다는 점이 key를 사용하는 이유다.
참고 자료
'kafka' 카테고리의 다른 글
docker bitnami/kafka 주키퍼없이(KRaft) (0) | 2023.09.02 |
---|---|
spring kafka - @KafkaListener Annotation (0) | 2023.09.02 |
Kafka의 아키텍처를 알아보자 (0) | 2023.08.11 |