首页天道酬勤MQ收到无序的消息时如何进行业务处理

MQ收到无序的消息时如何进行业务处理

admin 02-24 10:47 133次浏览

业务背景

与第三方系统对接,双方通过ActiveMQ通信,信息之间有内部关联,即信息应该有业务顺序,但由于某些原因,现在收到信息是混乱的,在这种情况下有一个小问题

方案一:自己重新排序

收到消息后,自己对内存进行排序,然后按顺序扔进队列,控制消息的发送和接收,确保按照发送顺序收到消息。

如果你自己排序,你应该标记每个消息的顺序,并指定哪些消息属于一类,并且相互依赖。

如果具体实现,可以这样做:

1、收到消息后,包装并添加序号,放入Redis中,用列表或有序集合存储,并用字符串类型存储当前业务单号的最小序号(默认为1)

2、如果使用有序集合存储,则使用序列号作为分数,以便消息丢失并排序。每次将最小分数的元素与当前最小序列号进行比较,如果小于或等于,则删除该元素并将其发送到MQ,并将最小序列号添加到1

3、如果您使用列表存储,您可以添加lpush。lrange检查首先放入的元素。与当前最小序列号相比,如果小于或等于,则rpop删除并发送MQ,最小序列号添加1

大概就是这个意思。以上是我的想法,没有实现。我觉得应该是可行的。

方案二:定期扫描任务

1、收到消息后,首先存储在数据库中,记录状态为“未消费”

2、业务处理

(1)如果处理这个消息不需要依赖其他消息,或者它所依赖的消息已经先处理,那么直接做业务处理,完成后更新消息记录表,把这个记录的状态放在“处理”之前。

(2)如果该消息依赖的消息尚未收到(通常表现为某个表的数据状态可能不正确或没有数据等。),则不予处理

3、定期扫描信息记录表,找到状态为“未处理”的数据,调用统一的信息处理接口,依次执行,逻辑相同

举个例子,

假设某个业务场景会收到5条消息,假设顺序为1、2、3、4、5

最极端的情况,假设先收到5,存表,暂时不处理

再收到4,存表,暂时不处理

三、存表,暂不处理

二、存表,暂不处理

1.存表,立即处理,更新状态“已处理”

第一次扫描定时任务,2处理,更新状态“已处理”

第二次扫描,3处理,更新状态“已处理”

第三次扫描,4处理,更新状态“已处理”

第四次扫描,5处理,更新状态“已处理”

到目前为止,所有的信息都是按顺序处理的


澳洲10计划稳定免费_澳洲幸运10计划 澳洲幸运10冠军定位计划_澳洲10七码雪球免费计划