카프카 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를 사용하는 이유다.
참고 자료
https://devocean.sk.com/blog/techBoardDetail.do?ID=164096
[Kafka] 파티션 키를 사용하여 특정 파티션으로 메시지 적재하기
devocean.sk.com
https://jyeonth.tistory.com/30
Apache Kafka 기본 개념 (Partition / Consumer / Consumer Group/ Offset Management)
Kafka는 가장 널리 쓰이는 메세지 큐 솔루션 중 하나이다. 다른 메세지 큐와 마찬가지로, Producer가 메세지를 publish하면 Consumer가 큐를 susbscribe하며 메세지를 가져가게 된다. 다만, 이 사이에 Topic / P
jyeonth.tistory.com
'back-end > kafka' 카테고리의 다른 글
| docker bitnami/kafka 주키퍼없이(KRaft) (0) | 2023.09.02 |
|---|---|
| spring kafka - @KafkaListener Annotation (0) | 2023.09.02 |
| Kafka의 아키텍처를 알아보자 (0) | 2023.08.11 |