【问题标题】:What's the best way to design message key in Kafka?在 Kafka 中设计消息密钥的最佳方法是什么?
【发布时间】:2018-02-03 21:25:16
【问题描述】:

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

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

我希望我的消息以有序的方式被使用。我知道 Kafka 保证分区内消息的顺序。因此,只要我想出一个正确的键结构,我就会以某种方式对我的消息进行分区,以使它们最终位于同一个分区中。在某种程度上,消息键将消息分组并将它们存储在分区中。

有意义吗?

问:是否有可能由于密钥设计不当而导致分区不均匀?一个人可能会收到比其他人更多的记录。它会对我的 Kafka 集群的性能产生不良影响吗?消息密钥设计的最佳实践是什么?

【问题讨论】:

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


    【解决方案1】:

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

    如果您不要求以与生成消息相同的顺序使用某些消息,则最好不指定密钥。如果这不是您的情况,那么您的要求会告诉您什么必须是您的密钥。例如,如果您想为给定用户保留生成消息的顺序,则 user_id 可能是您的消息键。

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

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

    【讨论】:

    • 您提到消息的顺序可能取决于生产者的配置方式,是否配置为在尝试失败时重试。是否有 Kafka 生产者配置参数?或者重试策略是必须在应用程序代码中考虑和实施的东西?
    【解决方案2】:

    Kafka 将在键上应用 murmur 哈希并以分区数取模,即 murmur2(record.key())) % num 个分区。在所有可能的情况下,它应该在默认分区的情况下均匀分布。我建议您使用用 java 编写的简单 murmur2 函数来试验所有关键选项,以查看分布模式,然后做出选择。 在 kafka 中也有两种默认分区的实现。 Murmur 哈希实现在较新的版本中。旧版本的工作方式有所不同。

    【讨论】:

    • 我认为奇怪是无关紧要的。
    • 感谢您的指出..同意你的看法..编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多