有没有办法在单个消费者的kafka主题的分区之间维护消息排序?

时间:2016-04-21 06:41:42

标签: streaming apache-kafka kafka-consumer-api

我们正在开发一个基于kafka的流式传输系统,其中生产者将在其主题内生成多个分区,并且单个消费者将从该主题中消费。我知道kafka在分区内维护消息顺序,但是我们可以在主题内的分区之间维护一个全局消息顺序吗?

3 个答案:

答案 0 :(得分:3)

简短回答: 不,Kafka不提供分区之间的任何订购保证。

答案很长: 我不太明白你的问题。如果您说您只有一个消费者在使用您的主题,那么为什么您在该主题中有多个分区并重新发明轮子以尝试维护分区之间的顺序?如果你想为未来增长留出一些空间,例如添加另一个消费者来消耗部分分区,然后你将不得不重新考虑你的“全局消息顺序”的想法。

您真的需要按顺序处理所有邮件吗?或者您可以按客户端/应用程序/任何分区进行分区并维护每个分区的顺序?在大多数情况下,您并不真正需要全局消息顺序,但只需正确地对数据进行分区。

维持多个消费者之间的秩序是一个非常难以解决的问题,即使正确解决,你也会忽略所有卡夫卡的好处。

答案 1 :(得分:0)

如果您想在多个分区中进行全局排序,那么您无法从kafka获益。 Kafka仅支持仅在一个分区中进行消息排序。在我们公司,我们只需要将相同的catergory消息发送到同一个分区,这可以使用partitionId轻松分区。

答案 2 :(得分:0)

Kafka中分区的目的是在更广泛的主题中创建消息的部分顺序,其中消息在任何给定分区中都遵循严格的总顺序。因此答案是“否”,如果要引入交叉分区顺序的概念,它将破坏分区的目的。

我建议改为关注如何键入消息(以Kafka的话来说就是记录)的键,从而有效地确定如何将它们映射到分区。只要映射是确定性的和可重复的,哪个分区就无关紧要-您只需要注意的是,相同关键字的记录将始终出现在同一分区上,因此不会同时分配给多个使用者(在同一消费者组内)。

如果要发布对持久实体的更新,则该实体的主键通常是Kafka记录键的良好起点。如果需要在一个连接的实体图上进行一些更新,那么请以图的ID根作为键,并使其成为密钥,这样可能会满足您的订购需求。