消息代理中的分区如何解决排序问题?

How does partitioning in message brokers solves ordering problem?

我大致有了分区的想法,但我不明白它是如何解决排序问题的。以 Chris Richardson 的书为例,如果我有 3 个关于给定订单的事件 "shard-key" 1(订单创建、订单更新和订单取消)。如果每个分区有多个实例,我如何确保事件按顺序处理?不是同样的问题裁员吗?

我的意思是,在该示例中,所有消息都会发送到第一个分片,但它们不会在两个实例之间循环吗?

如果您的记录有一个键,默认行为是任何给定的键总是被发送到同一个分区。

分区是一种分而治之的方法,但会带来一些牺牲,这在任何给定的问题域中都是完全可以接受的。具有多个分区的主题没有 'order' 的概念;正如您所指出的,您可以有多个相互竞争的消费者,它们可能 运行 以不同的速度。

相反,每个分区只会分配给一个消费者组中的一个消费者,正是在这个级别上,排序是严格的(大概)。我说严格是因为事情总是会出错,并且可以重新处理记录,因此开箱即用的 Kafka 永远无法绝对保证您的订购。

当你说你需要按顺序处理事情时,我需要想想这是多么重要。例如您可能会争辩说银行账户的交易应该按顺序处理(也许),因此特定账户的所有记录都应该在同一个分区上,但是两个不同账户活动的相对顺序并不重要。

关于分区策略,直到V2.3,没有密钥的消息将以循环方式发送到分区。从 v2.4 开始,KIP-480 引入了一个粘性分区程序来循环批次记录,而不是严格的一次一个。

Kafka按分区保证顺序。如果您需要保证它们的处理顺序,您的消息生产者必须确保将消息流发送到同一分区。

但是请注意,消费者实例的数量不能多于分区(每个消费者组)。