【问题标题】:Message to partition assignment, ordering and partition number resizing分区分配、排序和分区号大小调整的消息
【发布时间】:2018-09-30 14:26:36
【问题描述】:

据我了解,如果我在其中一个主题中使用键控消息,kafka 分区器将始终将具有相同键的消息发送到同一分区,这将确保该特定消息集的顺序。

此外,默认分区程序最初会根据该特定主题可用的分区数来决定将消息发送到哪个分区。类似于 messageKeyHash % numberOfPartitions。

我的问题是,如果我有一个包含 5 个分区 的主题,并发送 3 条消息 具有 key A 并且它们是全部分配给 partition 0,然后我 将该主题的分区数从 5 增加到 5+x,kafka 会“记住”带有键 A 的消息应该去partition 0 还是partitioner 可以用key A 向另一个partition 发送消息?

换句话说:如果我在运行时增加一个主题的分区数量,我是否会失去该主题中特定键的排序保证?

如果是,我该如何解决这个问题?如果我需要订购保证,应该总是过度分区吗?我应该实现自定义分区器吗(我不知道如何实现)?

谢谢

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    是的,如果您增加分区的数量,您将失去这种保证,因为带有密钥 A 的消息可能会进入不同的分区,而不再是分区 0。 一般来说,当您要创建主题时,过度分区或至少知道最佳分区数是一件好事。

    【讨论】:

      【解决方案2】:

      你可以通过两种方式解决这个问题

      1) 通过创建您自己的自定义分区器,该分区器将始终将相同的键解析到相同的分区,即使创建了更多主题分区也是如此。

      https://kafka.apache.org/0102/javadoc/org/apache/kafka/clients/producer/Partitioner.html

      2) 通过创建一个分区比原来多的新主题,将旧主题中的所有消息复制到新主题,然后将所有新主题发布到新主题。

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2013-10-14
        • 2012-03-21
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多