我有一个分区主题,其中包含X
分区。
截至目前,在制作消息时,我创建了仅指定ProducerRecord
和topic
的Kafka value
。我没有定义key
。
据我所知,我的消息将使用默认的内置分区器在分区之间平均分配。
另一方面,我有一个Kafka消费者的线程池。每个Kafka消费者都将在自己的专用线程中运行,消费来自该主题的消息。每个消费者都被赋予相同的group.id
。这将允许并行使用消息。将为每个消费者分配其公平份额的分区以供阅读。
我希望我的消息能够以有序的方式消费。我知道Kafka保证了分区内消息的顺序。因此,只要我提出了一个正确的密钥结构,我将以一种最终在同一分区中的方式对我的消息进行分区。在某种程度上,消息密钥将消息分组并将它们存储在分区中。
有意义吗?
问:有可能由于设计不良的密钥,我会得到不均匀的分区吗?人们可能会收到比其他人更多的记录。它会不会影响我的Kafka群集的性能?消息密钥设计的最佳实践是什么?答案 0 :(得分:2)
您对默认分区程序的理解是正确的。
如果您没有要求按照生成的顺序使用某些消息,那么不指定密钥是最佳选择。如果那不是你的情况,那么你的要求会告诉你什么是你的钥匙。例如,如果要保留给定用户生成的消息的顺序,user_id可能是您的消息密钥。
要实现特定的消息顺序,您需要考虑如何配置生成器。如果您的生产者可以在失败并且in flight messages
高于1的情况下重试发送消息,则可以不按顺序生成消息。
通过指定坏密钥可以获得不均匀的分区。例如,如果90%的用户来自纽约,10%来自其他城市并且您选择一个城市作为密钥,那么您的一个分区将是巨大的并且其中一个消费者超载(我假设消息的数量)每个用户是相同的。)
答案 1 :(得分:1)
Kafka将在密钥和模数上应用杂音哈希,分区数量为,即murmur2(record.key()))%num分区。在所有可能的引擎盖中,它应该在默认分区的情况下均匀分布。我建议你用一个用java编写的简单的murmur2函数来试验你所有的关键选项,看看分布模式,然后做出选择。 此外,kafka中还有两种默认分区实现。 Murmur哈希实现在较新版本中。旧版旧版本的工作方式不同。