如何给Kafka topic添加分区,让相同key的消息保持在同一个分区?
How to add partition to Kafka topic and keep same-key message in same partition?
要求在给定 Kafka 主题的同一分区中排序是很常见的。也就是说,具有相同密钥的消息应该进入相同的分区。现在,如果我想在 运行 主题中添加新分区,如何创建并保持一致性?
据我了解,默认分区策略是 mod on num-of-partition 。当 num-of-partition 改变时(例如 4 到 5),一些消息可能会与之前具有相同键的消息落入不同的分区。
我可以想象实现一致的散列来自定义分区行为,但这可能是侵入性的。
或者,停止所有生产者,直到所有消息都被消耗完;然后部署新分区并重启所有生产者。
有更好的主意吗?
正如您所说,当您增加主题中的分区数量时,您肯定会松散具有相同键的消息的顺序。
如果您尝试实现自定义分区程序以一致地将键分配给分区,您就不会真正使用新分区。
我会创建一个具有所需分区数量的新主题,然后让生产者写入该新主题。一旦旧主题的消费者处理完所有消息(即消费者滞后 = 0),您就可以让消费者从新主题中读取。
要求在给定 Kafka 主题的同一分区中排序是很常见的。也就是说,具有相同密钥的消息应该进入相同的分区。现在,如果我想在 运行 主题中添加新分区,如何创建并保持一致性?
据我了解,默认分区策略是 mod on num-of-partition 。当 num-of-partition 改变时(例如 4 到 5),一些消息可能会与之前具有相同键的消息落入不同的分区。
我可以想象实现一致的散列来自定义分区行为,但这可能是侵入性的。
或者,停止所有生产者,直到所有消息都被消耗完;然后部署新分区并重启所有生产者。
有更好的主意吗?
正如您所说,当您增加主题中的分区数量时,您肯定会松散具有相同键的消息的顺序。
如果您尝试实现自定义分区程序以一致地将键分配给分区,您就不会真正使用新分区。
我会创建一个具有所需分区数量的新主题,然后让生产者写入该新主题。一旦旧主题的消费者处理完所有消息(即消费者滞后 = 0),您就可以让消费者从新主题中读取。