消息队列高手课
李玥
美团高级技术专家
53223 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
进阶篇 (21讲)
消息队列高手课
15
15
1.0x
00:00/00:00
登录|注册

如何实现消息保序?

你好,我是李玥。
我看到有不少留言是关于“如何实现消息保序”的问题。关于这个问题,我在答疑中做了简单的回复,但限于篇幅并没有很深入。借助这次加餐的机会,我来深入地、一次性地把各种场景下如何实现消息保序的方法梳理清楚。
我们也会讨论在工程实践中,这些实现消息保序方法存在哪些限制、可能会遇到哪些问题,以及如何应对上面这些限制和问题,如何根据实际的业务场景,权衡一致性、可用性,做出取舍,实现相对的最优解。

哪些场景需要消息保序?

消息保序问题指的是,在通过消息中间件传递消息过程中,我们希望消费者收到消息的顺序,和发送者发送消息的顺序保持一致。或者说,消息中间件在传递消息时,不要改变消息之间的顺序。
不过在工程实践中,我们面临的保序问题不一定只是局限在消息保序这一个环节,更常见的场景是,事件经过包含消息队列等多个环节的处理和传递后,在某个服务内能够按照事件发生的顺序来逐个处理这些事件,不发生乱序。比如:
在证券、股票交易撮合场景中,对于出价相同的交易单,需要坚持按照先出价先交易的原则,下游处理订单的系统需要严格按照出价顺序来处理订单;
在数据库变更增量同步场景中,上游源端数据库按需执行增删改操作,将 BINLOG 作为消息,通过消息队列传输到下游系统,下游系统按顺序还原消息数据,实现状态数据有序更新;
在电商系统中,订单创建、支付、退款、物流等消息需要按照顺序处理,才能保证订单状态的正确更新;
在交易支付场景中,需要确保消息的顺序性和一致性,以满足金融领域对数据准确性的严苛要求。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 实现消息保序的方法包括使用基于队列的消息队列实现、配置多分区消息队列为单分区、使用哈希算法将相关消息发送到同一分区等。 2. 大多数场景并不需要全局消息保序,只需要保证有业务关系的消息之间的顺序即可,可以通过局部消息保序来提升消息吞吐量。 3. Kafka等消息中间件内置了功能来帮助实现局部消息保序,例如可以使用消息的Key来将相关消息发送到同一分区,从而实现消息的局部保序。 4. 重复消息问题可以通过在消息中携带单调递增的消息序号来避免,消费者可以通过序号判断收到的消息是否是重复消息。 5. 在节点故障情况下,消费者节点故障可能导致消息乱序,可以通过事后修复或自行维护分区与消费者实例关系来缓解乱序问题。 6. 在分区扩容时,可以选择在消息低峰期进行扩容操作,暂停消息生产并等待消息队列中的消息都消费完,避免扩容过程中并行处理导致消息乱序。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《消息队列高手课》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)