消息分区分配,排序和分区号调整大小

时间:2017-06-29 14:32:13

标签: apache-kafka

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

默认分区程序最初将根据该特定主题可用的分区数决定发送消息的分区。像messageKeyHash%numberOfPartitions。

我的问题是,如果我的主题是“ 5个分区”,则发送 3个消息 键A 并将它们全部分配到分区0 ,稍后我将该主题的分区数从5增加到5 + x,将kafka"记住&#34 34;具有密钥A的消息应该转到分区0,或者分区程序可以将带有密钥A的消息发送到另一个分区?

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

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

谢谢

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

1)通过创建自己的自定义分区程序,即使创建了更多主题分区,也始终将相同的密钥解析为同一分区。

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

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