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

news2024/11/14 15:17:06

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的基本概念都差不多了,现在就开始动手用起来

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年阿里云服务器购买指南,优惠云服务器性能说明

云服务器作为当下互联网行业的重要基础设施之一,对于个人博客、企业展示型官网以及开发者来说,是必不可少的工具。2023年,阿里云金秋云创季推出了两款特惠的云服务器,为用户提供了更加优惠和实用的选择。 1. 轻量应用服务器2核2G…

除了Excel中可以添加公式之外,在Word中也可以添加公式,不过都是基于表格

公式是必不可少的,因为它们有助于简化任何数学任务。微软的应用程序中有许多数学公式。微软应用程序之一的Word配备了一个公式功能,可以执行各种操作。本文将讨论如何在Word中使用和添加公式。 在Word中,公式主要用于表格。因此,你需要有一个表格才能在Word中使用公式。 …

盘点30个Python树莓派源码Python爱好者不容错过

盘点30个Python树莓派源码Python爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1LA4cLunntKW3qO5aok3xAQ?pwd8888 提取码:8888 项目名称 PiCar-raspber…

2023亚太杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…

响应系统的作用与实现

首先讨论什么是响应式数据和副作用函数,然后尝试实现一个相对完善的响应系统。在这个过程中,我们会遇到各种各样的问题,例如如何避免无限递归?为什么需要嵌套的副作用函数?两个副作用函数之间会产生哪些影响&#xff1…

儿童水杯上架亚马逊美国站CPC认证办理 ,常见儿童产品CPC认证测试要求

美国CPSC从2021/03/22开始改革,凡是他们管辖范围内的产品,都会被标记审查,如有相关产品请提前准备好相关文件比如CPC检测报告、认证等等,以备目的港海关审查。 CPC认证介绍 CPC证书即儿童产品证书,适用于12岁以下的儿…

腾讯云新用户优惠券如何领取?详细教程来了!

腾讯云一直致力于为广大用户提供优质、高效的云计算服务。为了吸引新用户,腾讯云推出了新用户专属优惠券,本文将详细介绍如何领取腾讯云新用户优惠券,助力大家轻松上云! 一、腾讯云新用户优惠券领取 领券入口:https:/…

人力项目框架解析新增修改方法

在迁移项目但是遇到了一些问题,迁移项目的时候发现项目的整体框架很有趣,但是苦于项目框架太大了,竟然只能完整迁移,做不到部分迁移,于是我也只能从一半的角度来进行解释整个项目。 雇员 我们雇员这个为对象讲解一下…

Django(六、模板层)

文章目录 模板传值模板语法传值特性 模板语法之过滤器常用的过滤器模板层之标签模板中的标签的格式为标签之if判断 标签之for循环模板的继承与导入模板导入导入格式 模板传值 """ 模板层三种语法 {{}}:主要与数据值相关 {%%}:主要与逻辑相关 {##}:模…

解锁数据潜力:为什么你应该考虑使用向量数据库

文章目录 前言什么是向量和向量数据库使用示例Amazon OpenSearch Serverless向量引擎总结 前言 根据DC调查数据显示,全球在A1技术和服务上的支出2023年将达到1540亿美元,到2026年将超过3000亿美元。其中,向量数据库为AI的开发、增强内容生成…

力扣203:移除链表元素

力扣203:移除链表元素 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出&a…

(Matalb回归预测)GWO-BP灰狼算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分代码: 四、完整程序数据使用说明下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Mata…

keepalived安装配置(服务器主备、负载均衡)

系统拓扑 安装keepalived 主备服务器上都需要安装 在线安装 yum install -y keepalived 离线安装 # todo 服务器准备 虚拟机ip:192.168.11.56 主服务器:192.168.11.53 备服务器:192.168.11.54 配置文件修改 keepalived安装之后&…

算法刷题:P1908 逆序对

解题关键:就是利用分治的思想,使用归并排序,因为逆序对实际上就是“左侧的数字比右侧大就算一个逆序对”。而这个“左侧”和“右侧”可以相对来看,即左侧的左侧一定就是左侧,说的有点抽象,哈哈哈哈。 花了…

excel在函数中插入函数

例如,要计算RAND()1的值,其中RAND()表示取0~1之间的随机数。 插入-》函数: 选SUM函数: 点击“继续”: 将光标先放在数字1中的输入框中,然后在左边过滤出RAND函数,并且点击继续&#xff1…

技巧篇:Mac 环境PyCharm 配置 python Anaconda

Mac 中 PyCharm 配置 python Anaconda环境 在 python 开发中我们最常用的IDE就是PyCharm,有关PyCharm的优点这里就不在赘述。在项目开发中我们经常用到许多第三方库,用的最多的命令就是pip install 第三方库名 进行安装。现在你可以使用一个工具来帮你解…

Java实现自定义windows右键菜单

要添加Java应用程序到Windows桌面的右键菜单,可以按照以下步骤操作: 创建一个新的.reg文件,并在文本编辑器中打开它。 添加以下代码到.reg文件中,将名称和路径替换为您的Java应用程序的名称和路径。 Windows Registry Editor V…

解决requests库的urllib3版本冲突问题

每个加班的夜晚,都是我和bug的较量。当我坐在电脑前,灯光昏暗,空气凝固,只有键盘敲击的声音回荡在空旷的办公室中。我渐渐地陷入了与无数个请求的斗争中。这些请求来自各种各样的客户端,充满了各种各样的需求。每个请求…

业务连续性:确保稳健运营的关键战略

在今天的快节奏商业环境中,保障业务连续性是企业成功的重要保障。业务连续性不仅仅是关于应对自然灾害或技术故障,更是一项战略,涉及组织的整体准备、规划和应对能力,以确保在各种情况下业务的稳健运营。 一、业务连续性的定义 业…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…