如何保证消费者接收消息的顺序

背景

以前面试的时候被问到关于mq如何保证消息的顺序问题,当时没回答好,网上也没找到满意的答案,因而本身想了一个面试

问题描述

假设,A和B经过消息队列通讯,A发了前后发了2条消息m1和m2。A发出的顺序是m一、m2,结果m2先到达队列,m1后进的,那么在队列中m2在前m1在后,假设这两条消息是有依赖关系的,必须是先m1再m2,那么B可能先接收到m2后接收到m1,问这个时候怎么办?数据库

个人思考

一、B接收到消息的顺序跟A发出消息的前后顺序以及消息在队列中的顺序是没有关系的。消息到达队列的前后顺序无法保证,一样,队列将消息投递出去之后接收消息的顺序也无法保证,因此,我想不管怎样做为消费者的B都必须保证业务的正确性,不管生产者怎么怎么发消息,队列怎么投递消息,做为消费者都必须意识到:接收到的消息是无序的,必须作好处理,务必保证业务正常。spa

二、我以为这是一个通用的问题,也是做为消费者必需要考虑的问题队列

三、消息的顺序并不重要,重要的是要保证业务的最终一致性消息队列

解决方案

方案一:本地消息表+定时扫描

一、接收到消息之后,将消息保存到本地数据库的表中,标记为未处理方法

二、若知足处理条件,直接处理,成功之后,标记表中的记录为已处理,而后向队列确认消息通信

三、若不知足处理条件,则暂不处理数据

四、定时扫描本地消息表,将那些未处理的再过一遍思考

五、幂等性判断很重要mq

举个栗子

假设,签到送积分。

再假设,签到和送积分是分开的,签到的逻辑是向签到表中插入一条记录,送积分的逻辑是判断积分所对应的签到记录是否存在,存在则送积分,不然不送。

接着假设,消息队列中有两条消息,一条是签到消息,另外一条是送积分消息,这条积分消息带着签到记录的id。

那么,送积分的时候就要依赖是否有签到记录。按照上面的理论,将消息先保存在本地,而后定时扫描,是能够正常进行的。

 

~~~水平有限,暂时只想到这种方法,欢迎批评指正!!!~~~

相关文章
相关标签/搜索