카프카 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

'kafka' 카테고리의 다른 글

docker bitnami/kafka 주키퍼없이(KRaft)  (0) 2023.09.02
spring kafka - @KafkaListener Annotation  (0) 2023.09.02
Kafka의 아키텍처를 알아보자  (0) 2023.08.11