Apache kafka 消息到分区分配、排序和分区号调整

Apache kafka 消息到分区分配、排序和分区号调整,apache-kafka,Apache Kafka,据我所知,如果我在一个主题中使用键控消息,kafka分区器将始终向同一分区发送具有相同键的消息,这将确保该特定消息集的顺序 此外,默认的分区程序最初将根据特定主题可用的分区数量决定向哪个分区发送消息。类似于messageKeyHash%numberOfPartitions的内容 我的问题是,如果我有一个主题有5个分区,并且发送了3条带有a键的消息,它们都被分配到了0分区,然后我将该主题的分区数从5增加到了5+x,卡夫卡会“记得”吗带密钥A的消息应该发送到分区0,或者分区程序可能会将带密钥A的消息

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

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

我的问题是,如果我有一个主题有5个分区,并且发送了3条带有a键的消息,它们都被分配到了0分区,然后我将该主题的分区数从5增加到了5+x,卡夫卡会“记得”吗带密钥A的消息应该发送到分区0,或者分区程序可能会将带密钥A的消息发送到另一个分区

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

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


谢谢

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

是的,如果增加分区数,则会失去这种保证,因为带有密钥A的消息可能会转到其他分区,而不再转到分区0。
一般来说,在创建主题时,最好是过度分区,或者至少知道分区的最佳数量。

您可以通过两种方法解决此问题

1) 通过创建自己的自定义分区器,即使创建了更多的主题分区,该分区器也将始终将同一密钥解析到同一分区


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

您可以通过两种方法解决此问题

1) 通过创建自己的自定义分区器,即使创建了更多的主题分区,该分区器也将始终将同一密钥解析到同一分区

2) 通过创建一个分区比原始主题多的新主题,将所有消息从旧主题复制到新主题,然后对新主题执行所有新发布