RocketMQ 如何保证消息顺序性
在 RocketMQ 的消息模型一文中,我们讲到为了实现多实例并发的生产和消费消息, RocketMQ 引入了队列,即一个主题下有多个队列。这样多个生产者就可以并行的生产消息,多个消费者也可以从不同的队列中读取消息并行的消费, 这样就引发一个问题,如何保证消息的顺序性, 这么说可能会有些抽象,我们通过一个场景来解释下消息顺序混乱的情况。
消息顺序混乱的例子
比如对于同一个商品的, 创建商品的信息写入 Queue1, 修改商品信息的消息写入 Queue2, 删除商品的信息写入 Queue3.但是当我们的消费组中有多个消费者时, 就可能出现消费者 A 消费了 Queue1 的消息执行创建操作,消费者 B 消费了 Queue2 的消息执行修改操作,消费者 C 消费了 Queue3 的消息执行删除操作,有可能消费者 B 或消费者 C 先执行, 这样就不能保证三条消息的之间的顺序。
RocketMQ 如何保证消息的顺序性
这里为了便于理解, 我们把 RocketMQ 的消息模型拿过来, 方便你查看,从消息模型中我们知道, 对于一个消费组来说,一个队列只能有一个消费者进行消费。上面消息顺序混乱的例子我们可以看到, 之所以会有消息混乱, 是因为对于同一个商品的消息写入了不同的队列中,如果我们能保证对于同一个商品的信息都写入同一个队列中就可以保证消息的消费是有序的。
比如我们可以使用商品的 ID 作为 Key,采用一致性哈希算法计算出队列编号,指定队列来发送消息。一致性哈希算法可以保证,相同 Key 的消息总是发送到同一个队列上,这样可以保证相同 Key 的消息是严格有序的。
从上面的分析中可以看到, RocketMQ 是在队列级别保证消息的有序性, 而不是在主题层面。如果想实现全局严格顺序, 只能把消息队列数量设置成 1,生产者和消费者也只能是一个实例。
版权声明: 本文为 InfoQ 作者【废材姑娘】的原创文章。
原文链接:【http://xie.infoq.cn/article/e0e474ba55001a603a6fd4be4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论