如何保证消费者接收消息的顺序
2018-06-18 03:55:49来源:未知 阅读 ()
背景
之前面试的时候被问到关于mq如何保证消息的顺序问题,当时没回答好,网上也没找到满意的答案,于是自己想了一个
问题描述
假设,A和B通过消息队列通信,A发了先后发了2条消息m1和m2。A发出的顺序是m1、m2,结果m2先到达队列,m1后进的,那么在队列中m2在前m1在后,假设这两条消息是有依赖关系的,必须是先m1再m2,那么B可能先接收到m2后接收到m1,问这个时候怎么办?
我的思考
1、B接收到消息的顺序跟A发出消息的先后顺序以及消息在队列中的顺序是没有关系的。消息到达队列的先后顺序没法保证,同样,队列将消息投递出去以后接收消息的顺序也没法保证,所以,我想无论怎样作为消费者的B都必须保证业务的正确性,无论生产者怎么怎么发消息,队列怎么投递消息,作为消费者都必须意识到:接收到的消息是无序的,必须做好处理,务必保证业务正常。
2、我觉得这是一个通用的问题,也是作为消费者必须要考虑的问题
3、消息的顺序并不重要,重要的是要保证业务的最终一致性
解决方案
方案一:本地消息表+定时扫描
1、接收到消息以后,将消息保存到本地数据库的表中,标记为未处理
2、若满足处理条件,直接处理,成功以后,标记表中的记录为已处理,然后向队列确认消息
3、若不满足处理条件,则暂不处理
4、定时扫描本地消息表,将那些未处理的再过一遍
5、幂等性判断很重要
举个栗子
假设,签到送积分。
再假设,签到和送积分是分开的,签到的逻辑是向签到表中插入一条记录,送积分的逻辑是判断积分所对应的签到记录是否存在,存在则送积分,否则不送。
接着假设,消息队列中有两条消息,一条是签到消息,另一条是送积分消息,这条积分消息带着签到记录的id。
那么,送积分的时候就要依赖是否有签到记录。按照上面的理论,将消息先保存在本地,然后定时扫描,是可以正常进行的。
~~~水平有限,暂时只想到这种方法,欢迎批评指正!!!~~~
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:函数重载(overload)
下一篇:java日常知识点积累
- Flink 如何分流数据 2020-06-11
- 老板让你抗住千万级流量,如何做架构设计? 2020-06-11
- 如何干掉 if else 策略+工厂 2020-06-11
- 类的继承,方法重新中修饰符如何定义 2020-06-10
- 如何写出高质量Spring 组件? 2020-06-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash