在kafka中设计消息键的最佳方法是什么?

cqoc49vn  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(405)

我有一个被分割的主题 X 分区。
到目前为止,在生成消息时,我创建了Kafka的 ProducerRecord 仅指定 topic 以及 value . 我没有定义 key . 据我所知,我的消息将使用默认的内置分区器在分区之间均匀分布。另一方面,我有一个Kafka消费者的线程池。每个kafka使用者将在自己的专用线程中运行,使用来自主题的消息。这些消费者中的每一个都得到了相同的答案 group.id . 这将允许并行使用消息。将为每个使用者分配公平份额的分区以进行读取。
我希望我的信息被有序地使用。我知道Kafka保证分区内消息的顺序。因此,只要我提出了一个合适的密钥结构,我就会对消息进行分区,使它们最终位于同一个分区中。在某种程度上,消息键将消息分组并存储在分区中。
有道理吗?
问:有没有可能因为一个设计糟糕的键,我会得到不均匀的分区?一个人可能会收到比其他人多得多的记录。它会影响我的kafka集群的性能吗?消息密钥设计的最佳实践是什么?

h7appiyu

h7appiyu1#

您对默认分区器的理解是正确的。
如果您不需要按照生成的顺序使用某些消息,那么不指定密钥是最佳选择。如果这不是你的情况,那么你的要求告诉你什么是你的关键。例如,如果要保留给定用户生成的消息的顺序,则用户id可能是您的消息密钥。
要实现特定的消息顺序,您需要考虑如何配置生产者。如果你的制作者可以在失败的情况下重新发送消息 in flight messages 如果大于1,则可能会无序生成消息。
通过指定坏键可以得到不均匀的分区。例如,如果90%的用户来自纽约,10%的用户来自其他城市,并且您选择一个城市作为密钥,那么您的一个分区将是巨大的,并且一个用户过载(我假设每个用户的消息数是相同的)。

of1yzvn4

of1yzvn42#

kafka将在密钥上应用杂音散列,并与分区数进行模运算,即杂音2(record.key())%num分区。在所有可能的情况下,它应该在默认分区的情况下得到均匀分布。我建议您用java编写的一个简单的Murrin2函数来试验所有的关键选项,以查看分布模式,然后做出选择。在kafka中还有两种默认分区的实现。杂音哈希实现是在较新的版本。旧的遗留版本的工作方式不同。

相关问题