什么是在卡夫卡设计消息密钥的最佳方式?

时间:2017-08-25 19:05:51

标签: multithreading multiprocessing apache-kafka kafka-consumer-api kafka-producer-api

我有一个分区主题,其中包含X分区。

截至目前,在制作消息时,我创建了仅指定ProducerRecordtopic的Kafka value。我没有定义key。 据我所知,我的消息将使用默认的内置分区器在分区之间平均分配。 另一方面,我有一个Kafka消费者的线程池。每个Kafka消费者都将在自己的专用线程中运行,消费来自该主题的消息。每个消费者都被赋予相同的group.id。这将允许并行使用消息。将为每个消费者分配其公平份额的分区以供阅读。

我希望我的消息能够以有序的方式消费。我知道Kafka保证了分区内消息的顺序。因此,只要我提出了一个正确的密钥结构,我将以一种最终在同一分区中的方式对我的消息进行分区。在某种程度上,消息密钥将消息分组并将它们存储在分区中。

有意义吗?

问:有可能由于设计不良的密钥,我会得到不均匀的分区吗?人们可能会收到比其他人更多的记录。它会不会影响我的Kafka群集的性能?消息密钥设计的最佳实践是什么?

2 个答案:

答案 0 :(得分:2)

您对默认分区程序的理解是正确的。

如果您没有要求按照生成的顺序使用某些消息,那么不指定密钥是最佳选择。如果那不是你的情况,那么你的要求会告诉你什么是你的钥匙。例如,如果要保留给定用户生成的消息的顺序,user_id可能是您的消息密钥。

要实现特定的消息顺序,您需要考虑如何配置生成器。如果您的生产者可以在失败并且in flight messages高于1的情况下重试发送消息,则可以不按顺序生成消息。

通过指定坏密钥可以获得不均匀的分区。例如,如果90%的用户来自纽约,10%来自其他城市并且您选择一个城市作为密钥,那么您的一个分区将是巨大的并且其中一个消费者超载(我假设消息的数量)每个用户是相同的。)

答案 1 :(得分:1)

Kafka将在密钥和模数上应用杂音哈希,分区数量为,即murmur2(record.key()))%num分区。在所有可能的引擎盖中,它应该在默认分区的情况下均匀分布。我建议你用一个用java编写的简单的murmur2函数来试验你所有的关键选项,看看分布模式,然后做出选择。 此外,kafka中还有两种默认分区实现。 Murmur哈希实现在较新版本中。旧版旧版本的工作方式不同。