0

我有一个分区主题,它有X分区。在Kafka中设计消息密钥的最佳方式是什么?

截至目前,在生成消息时,我创建了仅指定topicvalue的卡夫卡ProducerRecord。我没有定义key。 据我所知,我的消息将使用默认的内置分区器在分区间均匀分配。 另一方面,我有一个卡夫卡消费者的线程池。每个卡夫卡消费者都将在自己的专用线程中运行消耗该主题的消息。这些消费者中的每一个都被赋予相同的group.id。这将允许消费并行消息。每个消费者将被分配公平份额的分区来读取。

我希望我的消息有条不紊地被消费。我知道Kafka保证分区内的消息顺序。所以,只要我想出了一个合适的密钥结构,我就可以将我的消息进行分区,以便它们最终位于同一个分区中。在某种程度上,消息密钥将消息分组并存储在分区中。

它有道理吗?

问:是否有机会由于设计错误的密钥而导致分区不均匀?人们可能比其他人获得更多的记录。它是否会影响我的Kafka集群的性能?消息密钥设计的最佳实践是什么?

回答

1

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

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

要实现特定的消息顺序,您需要考虑生产者的配置方式。如果您的制作人可以在发生故障的情况下重试发送邮件,并且in flight messages大于1,则可以无序地生成邮件。

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

+0

你已经提到过,消息的顺序可能取决于生产者的配置方式,是否配置失败尝试后重试。是否有Kafka生产者配置参数?或重试策略是必须通过应用程序代码进行思考和实施的吗? –

0

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

+0

我会认为奇怪是无关紧要的。 – alf

+0

感谢您指出..同意你..编辑我的回答 – Swapnil

相关问题