首页 > 其他分享 >MQ收到无序的消息时如何进行业务处理

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

时间:2023-02-22 18:35:41浏览次数:28  
标签:存表 顺序 处理 无序 收到 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会被处理,更新状态“已处理”

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

 

标签:存表,顺序,处理,无序,收到,MQ,消息,序号
From: https://www.cnblogs.com/cjsblog/p/17145437.html

相关文章

  • RabbitMQ消费client注解模式 @RabbitListener自动创建队列
    @Component@Slf4jpublicclassRabbitMqConsumer{@AutowiredDingdingUtildingdingUtil;@RabbitHandler@RabbitListener(bindings......
  • RocketMQ - 生产者最佳实践总结
    相对消费者而言,生产者的使用更加简单,一般关注消息类型、消息发送方法和发送参数,即可正常使用RocketMQ发送消息常用消息类型消息类型优点缺点备注普通消息(并......
  • docker install Rabbit MQ
    https://morosedog.gitlab.io/docker-20190413-docker6/ WindowsPowerShellTrythenewcross-platformPowerShellhttps://aka.ms/pscore6PSC:\Users\[user]>......
  • RabbitMQ中间件
    RabbitMQ配置环境安装erlang环境以及RabbitMQRabbitMQ端口号:5672去官网下载https://www.rabbitmq.com然后重启RabbitMQ服务RabbitMQ安装教程开放端口15672这里,......
  • RabbitMQ(—)基础概念
    一个生产者-消费者模型,主要用于接收、存储和转发消息。可以类比成A寄东西给B,A将包裹送到邮局,邮局根据包裹地址和自己服务区域的地址匹配,打包装车,最后通过快递员送到B手上......
  • RabbitMQ消息中间件
    课程简介课程导读:RabbitMQ中间件本课程带你轻松入门,深度掌握RabbitMQ。 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务......
  • RabbitMQ消息中间件
    课程简介课程导读:RabbitMQ中间件本课程带你轻松入门,深度掌握RabbitMQ。 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务......
  • ASP.NET Core知识之RabbitMQ组件使用(二)
      近期,业务调整,需要内网读取数据后存入到外网,同时,其他服务器也需要读取数据,于是我又盯上了RabbitMQ。在展开业务代码前,先看下RabbitMQ整体架构,可以看到Exchange和队列是......
  • leetcode 581. 最短无序连续子数组 排序nlogn vs O(n)解法
    排序O(nlogn)之后找到第一个交换和最后交换的位置classSolution{public:intfindUnsortedSubarray(vector<int>&nums){vector<int>nn(nums);......
  • 在用python调用emqx的API时遇到数据格式转换问题
    获取的response的格式是bytes的数据类型,我需要转化成字符串或者字典使用,这里复习一下下面几个函数1.json->stringstr=json.dumps(json_type)2.bytes->stringstr=......