业务背景

跟第三方系统做对接,双方通过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收到无序的消息时如何进行业务处理的更多相关文章

  1. Rabbit mq订阅方式获取消息并可设置持久化

    Rabbit 通过方式获取消息:订阅方式事实上是向queue注冊consumer,通过rpc向queue server发送注冊consumer的消息.rabbitMQ Server在收到消息后,依据消 ...

  2. MQ之如何做到消息幂等 (转 优秀)

    一.缘起 MQ消息必达,架构上有两个核心设计点: (1)消息落地 (2)消息超时.重传.确认 再次回顾消息总线核心架构,它由 发送端.服务端.固化存储.接收端 四大部分组成. 为保证消息的可达性,超时 ...

  3. 在Boss直聘上投简历时,怎样保证有新消息时能及时收到

    最近在Boss直聘上投简历,偶尔会有HR给我发消息,不想在电脑上错过这些消息,但我又不能时时刻刻盯着这个页,怎么办呢? 这时,我想起来,之前做过的Chrome插件,如果检测到Boss直聘上新消息数大于 ...

  4. MQ系列6:消息的消费

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 在之前 ...

  5. ios之极光推送消息收到以后对消息的处理总结

    当我们的APP收到推送消息后,通常需要根据推送内容点击消息进入到指定的页面 这里讲一下收到推送消息后的处理,分为三种情况 :1.APP处于前台运行情况下     2.APP处于后台挂起情况下   3. ...

  6. spring+activemq中多个consumer同时处理消息时遇到的性能问题

    最近在做数据对接的工作,用到了activemq,我需要从activemq中接收消息并处理,但是我处理数据的步骤稍微复杂,渐渐的消息队列中堆的数据越来越多,就想到了我这边多开几个线程来处理消息. 可是会 ...

  7. activeMQ消费消息时网络流量异常大的问题

    http://www.cnblogs.com/baibaluo/archive/2012/12/24/2748468.html#2590289 公司有一个应用,多个线程从activeMQ中取消息,随着 ...

  8. Linux系统,无法收到组播消息的问题

    解决办法: 做以下3个修改 1. /etc/sysctl.conf 文件中的 net.ipv4.conf.all.rp_filter 设置成0 2. sysctl -w net.ipv4.conf.a ...

  9. 【mq读书笔记】消息拉取长轮训机制(Broker端)

    RocketMQ并没有真正实现推模式,而是消费者主动想消息服务器拉取消息,推模式是循环向消息服务端发送消息拉取请求. 如果消息消费者向RocketMQ发送消息拉取时,消息未到达消费队列: 如果不启用长 ...

  10. 【mq读书笔记】消息拉取

    疑问:PullRequest何时添加? PullMessageService提供延迟添加与立即添加2种方式 疑问:PullRequest是在什么时候创建的呢? 1.上上图中 PullRequest p ...

随机推荐

  1. ThinkPHP6.0在phpstorm添加查询构造器和模型的代码提示

    ThinkPHP6.0升级后 使用查询构造器和模型都没有了提示 原因是tp6源码中没有添加注释 找到Model.php * @method Query where(mixed $field, stri ...

  2. 火山引擎 DataLeap 的 Data Catalog 系统公有云实践

      Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...

  3. ArcObjects SDK开发 010 FeatureLayer

    1.FeatureLayer的结构 FeatureLayer是我们开发的时候用的最多的API之一,其实现的接口以及关联的其他API也非常多.下面我们就用一张图来整体看下FeatureLayer有哪些常 ...

  4. On Java 8读书笔记

    第一章 什么是对象 1.1 抽象的历程 "对象":问题空间中的元素及其解决方案空间中的具体呈现. 理念即是通过添加各种新的对象,可以将程序改编为一种描述问题的语言. 对象是具有状态 ...

  5. python自然语言处理(NLP)1------中文分词1,基于规则的中文分词方法

    python中文分词方法之基于规则的中文分词 目录 常见中文分词方法 推荐中文分词工具 参考链接 一.四种常见的中文分词方法: 基于规则的中文分词 基于统计的中文分词 深度学习中文分词 混合分词方法 ...

  6. Mac系统下word论文参考文献更新域

    写论文的时候可能会遇到后续要增加文献的情况 在参考文献增加后会发现文章中的交叉引用的序号并没有更新 下面分享两种情况的处理方法 一.更新全部域 首先确认自己的打印️项是选中的 2.  打开word偏好 ...

  7. 痞子衡嵌入式:低功耗&高性能边缘人工智能应用的新答案 - MCXN947

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦MCX系列MCU的新品MCXN947. 自 2015 年恩智浦和飞思卡尔合并成新恩智浦之后,关于它们各自的 Arm Cortex- ...

  8. des_招标

    网站 aHR0cHM6Ly9jdGJwc3AuY29tLyMv 翻到第二页,加载了一个2,并且返回的都是加密的数据  点到initiator,可以看到发送的Axios请求,尝试全局搜索intercep ...

  9. 在windows上构建OpenCascade

    基于作者QuaoarsWorkshop的视频Open Cascade Lessons,讲的非常详细,观看需要魔法 什么是OCCT?. 首先,Open CASCADE Technology SDK 是一 ...

  10. TensorRT基础笔记

    一,概述 TensorRT 是 NVIDIA 官方推出的基于 CUDA 和 cudnn 的高性能深度学习推理加速引擎,能够使深度学习模型在 GPU 上进行低延迟.高吞吐量的部署.采用 C++ 开发,并 ...