我有两个Kafka生产者将消息发送到具有多个分区的同一主题。
来自同一生产者PR1的具有相同密钥K1的消息总是按预期到达相同的分区PA1。
问题是来自另一个生产者PR2的具有相同密钥K1的消息转到另一个分区PA2,而我希望它们也转到PA1。
卡夫卡不保留跨生产者的分区分配吗?
这与两个生产者使用不同的Kafka客户端库有关吗?
如果我将两个生产者设置为使用相同的ID是否有帮助?
答案 0 :(得分:0)
可以根据configuration set,并通过partitioner.class
将org.apache.kafka.clients.producer.internals.DefaultPartitioner
传递给Producer API,为每个生产者配置如何将消息分配给分区。如果您想自己写一个interface。
这默认为{{1}},它使用键的哈希值来确保同一键的所有消息都在同一分区中。
答案 1 :(得分:0)
谢谢大家的评论和回答。
原因是其中一个Kafka库node-rdkafka
使用了与Java生产商https://github.com/Blizzard/node-rdkafka/issues/616不同的默认分区程序。
将partioner
配置更改为murmur2_random
即可。