kafka-spring Producer key에 따른 partition 배정
이 글은 Tistory에서 이전된 포스팅입니다. 원본은 여기에서 확인할 수 있습니다.
카프카 producer key
1
2
3
4
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
1
2
3
4
5
6
7
@Bean
public NewTopic messageTopic() {
return TopicBuilder.name(MSG_TOPIC)
.partitions(10)
.replicas(1)
.build();
}
partition은 10개로 구성하고
1
2
3
4
5
6
@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를 사용하는 이유다.
참고 자료
https://devocean.sk.com/blog/techBoardDetail.do?ID=164096
[[Kafka] 파티션 키를 사용하여 특정 파티션으로 메시지 적재하기
devocean.sk.com](https://devocean.sk.com/blog/techBoardDetail.do?ID=164096)