有什么方法可以保持单个消费者的 kafka 主题分区之间的消息顺序?
Is there any way to maintain message ordering between partitions of a kafka topic with a single consumer?
我们正在开发一个基于 kafka 的流系统,其中生产者将生产到其主题内的多个分区,而单个消费者将从该主题中消费。我知道kafka维护分区内的消息顺序,但是我们可以维护一个主题内分区之间的全局消息顺序吗?
简答:
不,Kafka 不提供分区之间的任何排序保证。
长答案:
我不太明白你的问题。如果您说只有一个消费者使用您的主题,那么为什么您在该主题中有多个分区并重新发明轮子以维持分区之间的顺序?如果你想留下一些 space 用于未来的增长,例如添加另一个消费者来消费部分分区,那么您将不得不重新考虑您的 "global message order" 想法。
您真的需要按顺序处理所有消息吗?或者您可以按 client/application/whatever 进行分区并维护每个分区的顺序?在大多数情况下,您并不真正需要全局消息顺序,而只需要正确地对数据进行分区。
维护多个消费者之间的秩序是一个非常难解决的问题,即使解决得当,你也会忽略 Kafka 的所有好处。
如果你想在多个分区中进行全局排序,你就无法从 kafka 中获益。 Kafka 只支持在一个分区中进行消息排序。在我们公司,我们只需要将相同类别的消息发送到同一个分区,可以使用partitionId轻松分区。
Kafka 中分区的目的是在更广泛的主题中创建消息的部分顺序,其中消息在任何给定分区中都遵循严格的总顺序。所以答案是'no',如果引入任何跨分区顺序的概念,就会破坏分区的目的。
我建议改为关注消息(记录,用 Kafka 的说法)是如何键控的,这有效地决定了它们如何映射到分区。具体哪个分区并不重要,只要映射是确定的和可重复的——你应该关心的是相同键控的记录将始终出现在同一个分区上,因此不会同时分配给多个消费者(在同一消费群体内)。
如果您要发布持久化实体的更新,实体的主键通常是 Kafka 记录键的良好起点。如果连接的实体图需要某种更新顺序,那么获取图的 ID 根并使其成为键可能会满足您的排序需求。
我们正在开发一个基于 kafka 的流系统,其中生产者将生产到其主题内的多个分区,而单个消费者将从该主题中消费。我知道kafka维护分区内的消息顺序,但是我们可以维护一个主题内分区之间的全局消息顺序吗?
简答: 不,Kafka 不提供分区之间的任何排序保证。
长答案: 我不太明白你的问题。如果您说只有一个消费者使用您的主题,那么为什么您在该主题中有多个分区并重新发明轮子以维持分区之间的顺序?如果你想留下一些 space 用于未来的增长,例如添加另一个消费者来消费部分分区,那么您将不得不重新考虑您的 "global message order" 想法。
您真的需要按顺序处理所有消息吗?或者您可以按 client/application/whatever 进行分区并维护每个分区的顺序?在大多数情况下,您并不真正需要全局消息顺序,而只需要正确地对数据进行分区。
维护多个消费者之间的秩序是一个非常难解决的问题,即使解决得当,你也会忽略 Kafka 的所有好处。
如果你想在多个分区中进行全局排序,你就无法从 kafka 中获益。 Kafka 只支持在一个分区中进行消息排序。在我们公司,我们只需要将相同类别的消息发送到同一个分区,可以使用partitionId轻松分区。
Kafka 中分区的目的是在更广泛的主题中创建消息的部分顺序,其中消息在任何给定分区中都遵循严格的总顺序。所以答案是'no',如果引入任何跨分区顺序的概念,就会破坏分区的目的。
我建议改为关注消息(记录,用 Kafka 的说法)是如何键控的,这有效地决定了它们如何映射到分区。具体哪个分区并不重要,只要映射是确定的和可重复的——你应该关心的是相同键控的记录将始终出现在同一个分区上,因此不会同时分配给多个消费者(在同一消费群体内)。
如果您要发布持久化实体的更新,实体的主键通常是 Kafka 记录键的良好起点。如果连接的实体图需要某种更新顺序,那么获取图的 ID 根并使其成为键可能会满足您的排序需求。