如何实现消息保序?
李玥

你好,我是李玥。
我看到有不少留言是关于“如何实现消息保序”的问题。关于这个问题,我在答疑中做了简单的回复,但限于篇幅并没有很深入。借助这次加餐的机会,我来深入地、一次性地把各种场景下如何实现消息保序的方法梳理清楚。
我们也会讨论在工程实践中,这些实现消息保序方法存在哪些限制、可能会遇到哪些问题,以及如何应对上面这些限制和问题,如何根据实际的业务场景,权衡一致性、可用性,做出取舍,实现相对的最优解。
哪些场景需要消息保序?
消息保序问题指的是,在通过消息中间件传递消息过程中,我们希望消费者收到消息的顺序,和发送者发送消息的顺序保持一致。或者说,消息中间件在传递消息时,不要改变消息之间的顺序。
不过在工程实践中,我们面临的保序问题不一定只是局限在消息保序这一个环节,更常见的场景是,事件经过包含消息队列等多个环节的处理和传递后,在某个服务内能够按照事件发生的顺序来逐个处理这些事件,不发生乱序。比如:
在证券、股票交易撮合场景中,对于出价相同的交易单,需要坚持按照先出价先交易的原则,下游处理订单的系统需要严格按照出价顺序来处理订单;
在数据库变更增量同步场景中,上游源端数据库按需执行增删改操作,将 BINLOG 作为消息,通过消息队列传输到下游系统,下游系统按顺序还原消息数据,实现状态数据有序更新;
在电商系统中,订单创建、支付、退款、物流等消息需要按照顺序处理,才能保证订单状态的正确更新;
在交易支付场景中,需要确保消息的顺序性和一致性,以满足金融领域对数据准确性的严苛要求。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. 实现消息保序的方法包括使用基于队列的消息队列实现、配置多分区消息队列为单分区、使用哈希算法将相关消息发送到同一分区等。 2. 大多数场景并不需要全局消息保序,只需要保证有业务关系的消息之间的顺序即可,可以通过局部消息保序来提升消息吞吐量。 3. Kafka等消息中间件内置了功能来帮助实现局部消息保序,例如可以使用消息的Key来将相关消息发送到同一分区,从而实现消息的局部保序。 4. 重复消息问题可以通过在消息中携带单调递增的消息序号来避免,消费者可以通过序号判断收到的消息是否是重复消息。 5. 在节点故障情况下,消费者节点故障可能导致消息乱序,可以通过事后修复或自行维护分区与消费者实例关系来缓解乱序问题。 6. 在分区扩容时,可以选择在消息低峰期进行扩容操作,暂停消息生产并等待消息队列中的消息都消费完,避免扩容过程中并行处理导致消息乱序。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《消息队列高手课》,新⼈⾸单¥59
《消息队列高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论