如何向Kafka主题添加分区并将相同键的消息保留在同一分区中?

Mor*_*eng 8 events consistent-hashing apache-kafka

要求在给定 Kafka 主题的同一分区中进行排序是很常见的。也就是说,具有相同密钥的消息应该发送到相同的分区。现在,如果我想在正在运行的主题中添加新分区,如何制作并保持一致性?

据我了解,默认的分区策略是对 num-of-partition 进行 mod 。当分区数量改变时(例如4到5),一些消息可能会落入与之前具有相同键的消息不同的分区中。

我可以想象实现一致的散列来定制分区行为,但这可能会造成干扰。

或者,停止所有生产者,直到所有消息被消耗完;然后部署新分区并重新启动所有生产者。

还有更好的想法吗?

mik*_*ike 8

正如您所说,当您增加主题中的分区数量时,您肯定会失去具有相同键的消息的排序。

如果您尝试实现自定义分区程序以对分区进行一致的键分配,那么您实际上不会使用新分区。

我将创建一个具有所需分区数量的新主题,并让生产者写入该新主题。一旦旧主题的消费者处理完所有消息(即消费者滞后 = 0),您就可以让消费者从新主题读取消息。