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

业务背景

跟第三方系统做对接,双方通过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,存表,暂不处理

3,存表,暂不处理

2,存表,暂不处理

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

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

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

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

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

至此,所有消息都按顺序被处理完了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java MQ是一种消息队列系统,用于实现异步通信和解耦业务。当MQ收到消息后,可以通过多线程处理来提高消息处理的效率和并发性。 在使用Java MQ接收消息后,多线程处理的过程可以简要描述如下: 1. MQ接收消息:Java MQ会监听指定的消息队列或主题,一旦有消息到达,就会将消息放入消息队列中等待处理。 2. 创建线程池:在接收到消息后,我们可以创建一个线程池来并发处理消息。线程池可以管理和控制线程的创建、复用和销毁,有效地利用系统资源。 3. 从消息队列中获取消息:多个线程可以同消息队列中获取消息进行处理。每个线程可以通过轮询或者订阅的方式从消息队列中获取消息,并进行相应的处理。 4. 处理消息:每个线程获取到消息后,可以根据消息的具体内容进行相应的处理处理的方式可以是调用业务逻辑方法、更新数据库、发送其他消息等。不同线程之间可以独立地进行消息处理,提高了消息处理的效率。 5. 完成处理处理完每个消息后,线程可以继续从消息队列中获取下一个消息进行处理,直到消息队列中没有未处理消息为止。 6. 销毁线程池:如果消息处理完毕或者不再需要处理消息,可以销毁线程池释放系统资源。 通过多线程处理MQ消息,可以提高消息处理的并发性和效率。同,多线程的使用还可以将消息处理过程与消息的接收过程分离开来,实现解耦和提高系统的灵活性。但是需要注意的是,在多线程处理消息的过程中,需要考虑线程安全和并发控制,以避免数据竞争和一致性问题的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值