MQ使用过程中,有些业务场景需要我们保证顺序消费,而如果一个Producer,一个Queue,多个Consumer的情况下是无法保证顺序的;

举例:

  1、业务上产生三条消息,分别是对数据的增加、修改、删除,而如果没有保证顺序消费,结果可能是删除、修改、增加,本来数据最终要删除

、结果变成增加

  2、或者是电商平台,先付钱,然后生成订单,然后通知物流(我对电商不怎么熟悉,这只是个例子而已,可能不太恰当),如果顺序改变了,

客户不付钱了,你却通知物流送货了

  所以,这些业务场景下,消息的顺序消费很重要

解决方案:

  1、一个Queue对应一下Consumer,把需要保证顺序的message都发送到一个queue当中,关闭autoack,prefetchCount=1,每次只消费

一条信息,处理过后进行手工ack,然后接收下一条message,只是由一个Consumer进行处理

  这里说一下,如果还是多个Consumer,使用同步处理,手工ack是不行的,第一时间每个Consumer都会收到message(如果message数量>

consumer数量),剩余的message才会等到ack之后发送过来,所以还是无法保证顺序消费

  2、上面的解决方案只是个人一些简单理解,真正的生产环境的方案很复杂,下面是大神的解决方案

需要保障以下几点:

  1、发送的顺序消息,必须保证在投递到同一个队列,且这个消费者只能有一个(独占模式)

  2、然后同意提交(可以合并一个大消息,或拆分多个消息,最好是拆分),并且所有消息的会话ID一致

  3、添加消息属性:顺序表及的序号、本地顺序消息的size属性,进行落库操作

  4、并行进行发送给自身的延迟消息(带上关键属性:会话ID、SIZE)进行后续处理消费

  5、当收到延迟消息后,根据会话ID、SIZE抽取数据库数据进行处理即可

  6、定时轮询补偿机制,对于异常情况

备注:比如生产端消息没有完全投递成功、或者消费端罗渡异常导致消费端落库后缺少消息条目的情况

解释:

  左边的步骤和之前讲的批量消息完全相同;

  右边步骤:

  1、接收到多条消息之后,首先不是进行逻辑处理,而是直接分别入库,把第一条消息入库的同时,发送一个延迟消息(例如5分钟,用来

保障所有的消息都接受到,进行统一处理),监听到延迟消息之后,根据sessionId和size查出一共多少条消息,然后根绝消息顺序去处理(

例如,起一个线程去处理)

  PS:接收到消息一定是先进行入库,在经过延迟消息接收过后,再进行处理

  个人对这个方案理解不深,可以自行理解。。。

迅速消息发送模式

1、迅速消息是指消息不进行落库,不做可靠性保障

2、适合日志数据、统计分析业务

3、优点就是性能和吞吐量达到最大

图例:

消息不进行落库,Producer不需要Broker进行confirm

RabbitMQ系列-顺序消费模式和迅速消息发送模式相关推荐

  1. 带你认识三种kafka消息发送模式

    摘要:在kafka-0.8.2之后,producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率. 本文分享自华为云社区<kafka消息发送模 ...

  2. aardio - nanomsg/nnmsg/nnm 消息发送模式图示

    nanomsg提供6种消息发送模式: pair:单线配对模式 push - pull  (pipeline) :任务分发模式 pub(publish) - sub(subscribe) :广播订阅模式 ...

  3. Objective-C(十九、通知-消息发送模式之中的一个)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结. 知识点一直在变.仅仅是作为參考.以苹果官方文档为准~ 十九.通知-消息 ...

  4. RabbitMQ的5种队列_消息确认模式_入门试炼_第6篇

    消费者从队列中获取消息,服务端如何知道消息已经被消费呢? 模式1:自动确认 只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费. 模式2:手动确认 消费者从队列中获取消 ...

  5. RocketMQ:Producer启动流程与消息发送源码分析

    文章目录 Producer 1.方法和属性 2.启动流程 3.消息发送 3.1验证消息 3.2查找路由 3.3选择队列 3.4发送消息 3.5发送批量消息 Producer 在RocketMQ中,消息 ...

  6. rocketmq 消息 自定义_RocketMQ的消息发送及消费

    RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...

  7. RocketMQ源码解析-Producer消息发送

    首先以默认的异步消息发送模式作为例子.DefaultMQProducer中的send()方法会直接调用DefaultMQProducerImpl的send()方法,在DefaultMQProducer ...

  8. producer send源码_RocketMq系列之Producer顺序消息发送源码分析(四)

    有序消息 消息有序指的是可以按照消息的发送顺序来消费. RocketMQ可以严格的保证消息有序.但这个顺序,不是全局顺序,只是分区(queue)顺序. 顺序消息生产者 public static vo ...

  9. RabbitMQ入门学习系列(三).消息发送接收

    快速阅读 用Rabitmq的队列管理,以及如何保证消息在队列中不丢失.通过ack的消息确认和持久化进行操作.以及Rabbit中如何用Web面板进行管理队列.消费者如何处理耗时的任务 生产者代码创建链接 ...

最新文章

  1. 查看oracle的表空间使用,查看Oracle的表空间的使用情况
  2. python3精要(35)-模块(1)-import
  3. php html 文本域,html文本域标签属性有哪些?html文本域标签属性用法介绍
  4. 深度学习(三十五)——Style Transfer(2), YOLOv3, Tiny-YOLO, One-stage vs. Two-stage
  5. javascript入门_JavaScript代理快速入门
  6. python发动机悬置解耦计算-按重心处整车坐标系解耦
  7. (转)Ubuntu下JDK7安装全过程并调试第一个带包的java程序
  8. 计算机图形学代码之三角形绘制
  9. 【随笔记】做事要讲究轻重缓急,一定要把握主次轻重。
  10. mybatis-plus lambda表达式学习笔记
  11. Word文档中styles分析
  12. Python PEP8 — the Style Guide for Python Code
  13. 【调剂】南京邮电大学2020年硕士研究生招生调剂预告及相关说明
  14. 如何做PPT页面设计
  15. 和python有关的职位_和的解释|和的意思|汉典“和”字的基本解释
  16. rdd 内生分组_内生性问题和倾向得分匹配, 献给准自然试验的厚礼
  17. 查看san交换机端口流量_MRTG监测交换机端口流量图解(图文)
  18. 支付宝 android ui,Android 仿支付宝芝麻信用分仪表盘效果 CreditSesameRingView
  19. PV操作经典例题——吃水果
  20. 什么商业模式是适合你,元宇宙电商NFG了解一下

热门文章

  1. QT乱码总结2.gbk和ANSI和gb2312的区别
  2. 16.IDA-列出函数中存在的全部call
  3. 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分
  4. C++ STL : 模拟实现STL中的vector类
  5. SpringBoot:切面AOP实现权限校验:实例演示与注解全解
  6. Linux IO磁盘篇整理小记
  7. The Tail at Scale
  8. 王亚楠:基于强化学习的自动码率调节
  9. 如何做一款面向企业客户的商用级 SDK
  10. SRS提供的librtmp