RocketMQ中的消息种类以及消费模式

RocketMQ中的消息种类以及消费模式

  • 前言
  • 消息的种类
    • 按消息的发送方式
      • 同步消息
      • 异步消息
      • 单向消息
    • 按消息的种类
      • 普通消息(Normal Message)
      • 顺序消息(Orderly Message)
      • 延时消息(Delay Message)
      • 事务消息(Transaction Message)
        • 事务消息的执行过程
        • 半事务消息(Half-Message)
        • 为什么要先发再执行
        • 事务消息的限制
  • 消息的消费模式
    • 集群消费模式
    • 广播消费模式
    • 两种消费模式简单对比

前言

在前文中我们已经介绍了RocketMQ的基本概念,本文来介绍消息的种类以及消息常用的消费模式

当然大家也可以查看RocketMQ的官网的官方文档

消息的种类

我们知道不同业务可能要用到不同消息,那么RocketMQ中的消息种类有哪些呢?

按消息的发送方式

同步消息

发出消息后,需要等待收到服务端的接收确认信息之后再发送下一个消息。

假如下面的生产者要发送两个消息:消息1和消息2,生产者先发送消息1,在发送完消息1之后并不会继续发送消息2,而是会等待RocketMQ接收后的响应
在这里插入图片描述
然后RocketMQ会发送一个接收成功的消息给生产者
在这里插入图片描述
然后再发送第二个消息,再等待接收成功的响应,以此往复。。。。
在这里插入图片描述
也就是每次生产者发送完消息,都要等待RocketMQ发给自己接收成功的消息以后才会继续发送消息。

这种一般用于比较重要的消息,比如发送短信

异步消息

与上述的同步消息略有出入,这种消息不需要等待对方的接收响应就可以继续发送下一个消息。
在这里插入图片描述
可能在发送完消息2之后才会收到响应
在这里插入图片描述

单向消息

这个不像上面的两个 这种消息不需要RocketMQ的响应
在这里插入图片描述
这种一般用于日志性质的消息

按消息的种类

普通消息(Normal Message)

最常用的消息,没有什特别的要求,只要能正常生产消费即可。

比如一些营销短信和通知短信

顺序消息(Orderly Message)

一系列相关消息的消费顺序有要求,必须有先后的消费顺序

比如系统中的多笔款项转到同一张银行卡,必须保证转账消息的先后顺序,才能确保用户收到款项的正确顺序

一般是通过设置队列选择器和队列数量一系列的消息放到同一的队列中实现。

延时消息(Delay Message)

这类比较简单,就是一种在一定时间后才会被消费的消息。

比如,我们的定时生日邮件

事务消息(Transaction Message)

事务消息是一种特殊的消息类型,它可以保证消息的发送本地事务执行结果一致

看起来不太好理解,我们一个一个看:
消息的发送:就是生产者消息发送到RocketMQ上的过程
本地事务: 这个更好理解,就是你本地的一个操作集合,这些操作要么一起成功要么一起失败
执行结果的一致: 也就是本地事务成功 我这条消息能保证发送到RocketMQ上被消费 ,本地事务执行失败,该消息就无法被消费

这么一分析是不是有点看得懂了?下面们以一个简单的转账示例来更加形象的理解事务消息
假如你现在带着你的银行卡去银行的ATM机上转账1000到另外卡上,并且该ATM机的转账业务是以消息的形式交给其他的银行的,那么这样的话我们可以画出这样一个图,来模拟转账的流程:
在这里插入图片描述

  1. 将我要转账1000的消息发送给RocketMQ上面
  2. RocketMQ收到消息,给ATM机响应:我收到了,你本地扣款1000吧
  3. ATM执行本地扣款,从你的银行卡上扣除1000余额
  4. RocketMQ该转账消息交给对应的银行消费者消费,增加收款方余额1000

前提:只要消息放到RocketMQ上,就可以默认消息不会丢失,而是会被顺利执行

所以我们这里只考虑前三步即可,看出来上述前三步的问题了吗?

本地的扣款是一个本地事务,如果因为某些原因比如突然断电,短路,导致事务没有执行成功,但是消息已经发出去了,会造成什么后果?

没错,会导致你的卡上没有少钱,而转账的卡上多了1000

银行:
在这里插入图片描述
所以为了避免上述情况的发生,我们应该让该消息与本地事务紧密绑定在一起,本地事务成功,该消息能被消费,本地事务失败,就不能被消费

为了保证消息与本地事务的一致性,我们看看事务消息是怎么做的。

事务消息的执行过程

以上面的业务演示
在这里插入图片描述

半事务消息(Half-Message)

RocketMQ服务端将消息持久化成功之后,向生产者返回Ack确认消息已经发送成功,此时消息被标记为"暂不能投递"(不会让消费者消费),这种状态下的消息即为半事务消息

了解了半事务消息,我们来分析上图的流程:

  1. ATM机发送半事务消息给RocketMQ: 我要转账了
  2. RocketMQ将该消息存好以后,告诉ATM机:我存好了,你开始本地事务吧,执行完告诉我
  3. ATM机执行本地的扣款事务
  4. ATM机本地事务执行完成,告诉RocketMQ,这里的本地事务有两种结果:成功-RocketMQ将半事务状态标记为可投递,该消息可以被消费失败-将回滚事务不会将半事务消息投递给消费者。也有可能没有给RocketMQ响应,比如直接宕机了,这样的话RocketMQ就会走第五步。
  5. 当然也有意外比如:ATM事务执行到一半,碰上歹徒把电断了,就没法告诉RocketMQ本地事务的执行结果了。此时RocketMQ会有一个回查操作(有次数限制,不会无限制回查超过次数无响应视为失败),即主动询问ATM机那个事务执行完成没有
  6. 如果ATM机有幸还有一点电,那么它会检查一下该事务的状态
  7. 然后再走第四步的操作,告诉RocketMQ:成功-RocketMQ将半事务状态标记为可投递,该消息可以被消费失败-将回滚事务不会将半事务消息投递给消费者。没有回应的话,默认为失败
为什么要先发再执行

在上述的过程中,可以看出是一个先发再执行先发半事务消息再去执行本地事务

我们这里可以打一个问号:为什么?既然这么麻烦,为什么我们不本地执行完本地事务再去提交消息?这样本地事务如果执行失败,都不用再去发消息了。

为什么不行?很简单,如果你本地事务执行成功以后再去发送消息,此时如果你的消息发不出去呢

也就是你本地扣了款,但是消息发不出去呢?比如遇到网络拥堵或者异常,又或者是RocketMQ端宕机,你怎么办?

相关版本回滚到你提交事务之前的版本吗?要是在你的事务提交之前有很多其他事务已经提交了呢?也就是你的回滚会导致其他的事务的操作丢失。所以这种方式,一旦你本地提交完了事务,而消息却无法发送出去,所要付出的代价太大了

但使用半事务的机制就可以避免这个问题:如果半事务消息都发不出去,根本不会执行本地的事务

如果半事务消息发送出去,但是本地事务没有执行或者执行失败,这个半事务消息最终不会被消费,因为收到(或者回查到)的是事务执行失败的状态,会进行回滚。该消息会随你本地的事务的失败而不会被回滚,也就不会被后续的消费者消费

其实说穿了事务消息就是给消息加了类似事务的“提交“与“回滚”的操作,以此来达到与本地事务的最终结果保持一致性

事务消息的限制

当然事务消息也有一些限制:仅仅能保证最终一致性无法保证实时的一致性

很好理解,也就是我们的本地事务执行完成,半事务消息也发上去也被标记为可投递状态,但是该消息还没被消费者消费

简单的比方就是:你发起转账了,你余额也扣除了,但是你的另一张卡没有实时收到钱,这时就会导致一个问题: 我本地操作显示成功了,但是我另一张卡没收到钱?

因为此时你的转账消息还没被消费者消费,就导致了这种情况。当然了,最终肯定会到账的,这就是最终一致性

其他的限制,请参考RocketMQ的官网的官方文档。

消息的消费模式

我们知道有的消息是只能被消费一次的,比如支付消息只能给支付模块消费一次

当然也有的消息需要被消费多次,比如日志消息要给订阅该主题的各个模块各自消费一次

集群消费模式

消息只被消费者组内的消费者消费一次。如以下这样:消费者组订阅了支付主题,每个消费者获得的消息队列(queue各不相同)每条消息只被消费一次
在这里插入图片描述

广播消费模式

消息被消费者组内的消费者各消费一次。如以下这样:其中的业务日志模块、业务模块、普通日志模块都订阅了日志主题,那么每条日志消息会给每个消费者各消费一次

在这里插入图片描述

两种消费模式简单对比

消费模式优点缺点
集群消费可以实现消息的负载均衡(消息被平分给每个消费者),提高消费的效率和性能如果消费者实例数量大于主题的队列数量,会导致部分消费者无法分配到队列,从而无法消费消息
广播消费可以实现消息的多播,满足多个消费者同时处理同一条消息的需求增加消息的网络传输和存储开销,以及消费者的处理压力

到这里RocketMQ的基本概念都差不多了,现在就开始动手用起来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/150372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (六)

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

Chrome 浏览器经常卡死问题解决

Chrome 浏览器经常卡死问题解决 chrome 任务管理器杀进程 mac 后台有很多 google chrome helper 线程并且内存占用较高 一直怀疑是插件的锅 其实并不是-0- 查看是哪个网页,哪个插件占用内存 chrome 更多工具 -> 任务管理器 切换到稳定版本的 chrome&#xff0c…

每天学习一点点之从 SonarQube Bug 看对线程中断异常的处理

最近在基于 SonarQube 对代码进行质量优化,说实话,之前觉得 SonarQube 这种很无聊,但最近静下心来看了一些扫描出来的问题后,发现这种工具作用还是挺大的,能够帮助我们找到代码中的隐藏缺陷,从而夯实基础。…

数据存储和内存对齐

校内课复习笔记 非数值数据表示 在计算机中,只有01序列,这串01序列是什么意思,由人为定义。 西文字符 在ASCII码中,通过一个65的偏移量,使得一部分无符号数指向A-Za-z。 在C语言中,通过char类型的转换规范…

Zookeeper Java SDK 开发入门

文章目录 一、概述二、导入依赖包三、与 Zookeeper 建立连接四、判断 ZooKeeper 节点是否存在四、创建 ZooKeeper 节点数据五、获取 ZooKeeper 节点数据六、修改 ZooKeeper 节点数据七、异步获取 ZooKeeper 节点数据八、完整示例 如果您还没有安装Zookeeper请看ZooKeeper 安装说…

问题 H: 棋盘游戏(二分图变式)

题意:要求找到 不放车就无法达到最大数的点 的个数 题解:1.以行列绘制二分图 2.先算出最大二分匹配数 3.依次遍历所有边 删除该边,并计算二分匹配最大值 (若小于原最大值即为重要点)&#xff0…

Vue3中使用provide和inject依赖注入完成父组件和孙子组件之间参数传递

Vue3中使用provide和inject依赖注入完成父组件和孙子组件之间参数传递 官网介绍 注意以下写法都是使用setup 代码结构 依赖注入-父组件 import { ref, provide } from "vue"const outDialogCardInfo ref() function updateOutDialogCardInfo(item) {console.log…

sCrypt Playground 发布

sCrypt Playground 发布了。 与桌面IDE 完全相同的功能,但是无需安装。体验地址: https://playground.scrypt.io。 请不要在 sCrypt Playground 上存储重要数据。我们会不定时清除用户保存在其上的数据。

韩国黄金代理商主动出击时机

受中东局势影响,十月底国际价格一度重新站上2000美元大关,韩国的黄格也随之出现上涨,当地投资者对黄金投资的热情再次升温。在韩国首尔市钟路附近的金店一条街,聚集了大大小小上百家金店,即使是在平日的中午&#xff0…

软件测试方案该怎么做?

做某项工作之前都需要有个计划或方案,软件测试亦如此。软件测试方案就是描述测试目的、范围、方法和软件测试的重点等文档。对于验证软件产品的可接受程度编写测试计划文档是一种有用的方式,可以使测试工作和整个开发工作融合起来,让资源和变…

OpenAI发布会震撼AI界,千字文全面解读

你的朋友圈是否被近日 OpenAI 的开发者大会刷屏了?这是预料之中的事。在近日,OpenAI 首度召开了旨在定义未来应用市场的开发者大会。 让我们迅速捕捉 OpenAI 最新的动态以及 ChatGPT 的更新亮点。 1、OpenAI 最新动态 今晨的盛会聚焦于以下要点&#xf…

docker安装SMQTT

docker安装SMQTT smqtt介绍 官方地址: https://www.smqtt.cc/ 官方文档地址: https://wiki.smqtt.cc/docs/smqtt/ 一款高性能&开源的MQTT服务器,支持单机、容器化、集群部署,支持多种协议,具备低延迟,高吞吐量,…

windows 电脑删除不了.TTF的文件

出现这个问题,首先检查,你的.ttf文件是不是在哪个软件中打开了。 如果是,先关掉,然后在删一遍试试。 如果这个还是不行试着打开控制面板>外观和个性化> 字体 > 字体设置>还原默认字体设置勾选,然后重启一下…

网络嵌入综述

图嵌入综述整理(上) 来源:图算法探索系列(一):图嵌入模型的原理和应用篇【万字长文】 图9是DeepWalk模型在推荐场景下的应用。图9(a)显示的是不同用户在不同Session中的item点击序列…

使用MathType将文献中的数学公式进行转换

mathtype将文献中的数学公式进行转换 文章目录 mathtype将文献中的数学公式进行转换一、截图识别二、MathType下载与设置2.1、MathType介绍2.2、[下载位置](http://www.51xiazai.cn/soft/5975.htm)2.3、设置 三、使用MathType: 一、截图识别 这两个在线网站都可以将…

A股风格因子看板 (2023.11 第10期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第10期,指数组合数据截止日2023-10-31,要点如下 近1年A股风格因子收益…

谷歌提出AGI的6大原则,和5大能力等级

随着ChatGPT等大模型的出现,AGI概念正在从哲学层面快速转向实际应用落地,并且ChatGPT已经展示出了初级AGI的功能(如AutoGPT),有不少专家认为,AGI时代可能在10年内到来。 因此,需要一个明确的技术框架来讨论和衡量不同…

【带头学C++】----- 六、结构体 ---- 6.7 结构体的对齐规则

6.7 结构体的对齐规则 6.7.1 知识点引入 6.7.2 结构体自动对齐规则 1、确定分配单位(一行分配多少字节) 结构体中最大的基本类型长度决定 2、确定成员的偏移量 成员偏移量成员自身类型的整数倍 需要根据你所在平台的位数,32位和64为类型大小不一样。cpu一次读取…

行情分析——加密货币市场大盘走势(11.15)

大饼按照预期等待下跌即可,现在已经下跌到35500,昨日晚上跌破了35000,现在放心大胆空。笔者现在都是空单在手。 空单策略:入场36000附近 止盈34000-32000 止损39000 以太昨日策略进场,已经止盈了,最低跌到…

11-Vue基础之组件通信(二)

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习目标: 坚持每一次的学习打卡 文章…