消息队列 - RocketMQ

news2024/9/29 0:20:51

1. 名词解释和概念

NameServer

  • 是一个无状态节点,可集群部署,节点之间无任何信息同步
  • 用于服务注册和发现,为 MQ 集群提供服务协调与治理
  • 记录并维护 Topic 和 Broker 的信息
  • 为生产者和消费者提供 Topic 的路由信息

无状态和有状态:
举例:用户登录完后,将用户信息保存在一个地方,供以后其他动作来获取这些数据来完成对应的操作。这个时候,如果有动作需要获取这些保存的用户信息才能完成,那么我们就称这个动作是有状态的。用于存放用户信息的地方叫做暂存区,共用一个暂存区的动作,称之为“上下文

现在我们给出无状态的概念:每次动作所需的数据全部由外界提供,服务端内部不做任何的暂存;并且请求可以提交到服务端的任意副本节点上,处理结果都是完全一样

拓展:为什么现在都说要做成无状态的呢?
在现在的分布式系统中,“有状态”也就意味着用户的请求发送到服务端的时候,服务端里都保存着这个用户的一些基本信息;在微服务的架构中,用户的一些基本操作和主要功能的操作可能是分散在不同的服务器中进行,那么用户的信息都保存在用于处理用户基本操作的服务器中;如果此时这台服务器宕机了,那么该用户的一些操作将没有办法同步到备份的服务器中,除非这台服务器实时与主服务器保持用户信息的同步。所以现在大多数主流的观点都说要做成无状态的方式
在无状态的方式下下,用户的信息会随着每次的请求发送到服务器,专业一点来说,就是每次需要处理的数据都通过上游的服务器放到参数中传进来
当然,无状态方式下也会有属于他的弊端,就是每次传输的网络数据包会比较大


Broker

  • RocketMQ 的核心,负责消息的接收,存储,拉取等功能
  • 分为 Master 和 Slave ,一个 Master 对应多个 Slave
  • 每个 Broker 都会与 NameServer 集群中的每个节点保持长连接,定时把 Topic 的信息同步到 NameServer
  • 在启动的时候,会首先向 NameServer 注册,然后同步 Topic 的路由信息

Producer生产者;用来构建并传输消息到服务端的实体


Consumer

  • 消费者;用来接收并处理消息的实体
  • Push Consumer:推消费者,会注册一个监听的接口,一旦监听到有消息,就会立马回调监听接口中的方法,让 broker 将消息推送过来
  • Pull Consumer:拉消费者,消息的拉取由应用控制;当应用需要消息时,才会去 broker 拉取消息

Topic主题

  • 消息的第一级类型
  • 是消息的逻辑分类,一个 Topic 可以分布在不同的 Broker 上,把一个 Topic 分布在一个 Broker 上的子体称为分片
  • 数据分片其实是指按照某种规则将存放在一个地方的数据分散的存放在多个数据节点中,这样在高并发的场景下,请求被分散到各个节点中,从而达到提升性能的目的

Message Queue

  • Topic 被划分为一个或多个子主题,称为 Message Queue
  • 一个 Topic 下,可以设置多个 Queue

Tags:是 Topic 下的第二级消息类型,可以使用 Tags 在同一个 Topic 下进行消息过滤

2. 架构图

在这里插入图片描述

3. 发送和消费流程

3.1 发送流程

在这里插入图片描述

注意:上面流程图中有一个寻找 “默认路由” 的操作
说明:如果一个消息中指定的 Topic ,没有找到对应的 Broker,那么这个时候会去寻找可以自动创建不存在 Topic 的 Broker,让这个 Broker 去创建不存在的 Topic ,然后再把消息发送至新的 Topic 中

但是这样会有一个弊端,设想:如果此时生产者在连续不断的发送消息,因为 Broker 并不是实时的把新的 Topic 路由信息同步给 NameServer 的,而是每隔一段时间同步一次。那么在没有同步的这段时间里,由于生产者还在不断发送消息,那么就有可能出现其他也可以自动创建新 Topic 的 Broker 也在自己那里创建该 Topic。这种情况是好的,这样当同步路由信息给 NameServer 时,下次就会有多个 Broker 去处理这个 Topic 的消息,达到负载均衡的效果。但是,如果生产者不是连续不断的发送,而是偶尔发一次,且间隔的时间大于每次 Broker 同步给 NameServer 的时间,那么在 NameServer 中只记录了只有这一个 Broker 可以处理该 Topic 下的消息,此时就达不到负载均衡的效果了

3.2 消费流程

3.2.1 消息获取

消费者消费消息有两种获取消息的方式:pushpull

push:推模式
pull:拉模式

顾名思义:推模式是 Broker 主动向 Consumer 推送消息;拉模式是 Consumer 根据需要,请求 Broker 将消息返回

实际上,push 和 pull 都是采用 Consumer 主动拉取的方式
push 模式下,其实是建立了一个长轮询的 pull 模式
两者的不同之处在于:push 模式下,如果 Broker 里没有数据,Broker 会阻塞该请求,直到有数据返回或者超过本次请求的时间才会返回;而 pull 模式下则不会对请求进行阻塞

3.2.2 消息消费

所谓消费:其实就是 Consumer 订阅关注的 Topic ,然后获取并消费消息

消费者通常是以一个集群的方式存在,相同 Group ID 的 Consumer 属于同一个集群,同一个集群下的 Consumer 的消费逻辑必须是一样的

消费模式分为两种:集群消费和广播消费
集群消费:任意一条消息只要被同一个集群下的 Consumer 消费过一次即可,集群下的 Consumer 平摊所有的消息,达到负载均衡的目的
广播消费:消息会推送给集群中所有的 Consumer,保证消息被每一个 Consumer 消费一次

4. 消息的种类

同步消息:指消息发送方发出数据后,会进入阻塞状态,直到 MQ 服务方发回响应消息
适用场景:重要通知消息的发送


异步消息:指发送方发出数据后,无需等接收方响应,继续发送下个数据包。在异步发送的模式下,用户端不需要等待服务器响应即可直接返回,通过回调接口接收服务器的响应结果并对其进行处理
适用场景:一般适用于处理的链路较长,对 RT时间 敏感的业务场景;比如大资料的上传等


单向消息:只负责发送消息,服务器的回应对其来说并不重要,只需保证消息发送出去了即可
适用场景:适用于耗时短,但对可靠性要求不高的场景


事务消息:RocketMQ提供分布式事务功能来保证业务员发送方和MQ消息的一致性,其本质是使用半消息(Prepared 消息和 Commit 消息)机制来实现
流程如下:

  1. 发送方向 RocketMQ 发送消息
  2. RocketMQ 将消息持久化之后,向发送方发送 ACK 信号,此时消息为 Prepared 消息
  3. 发送方开始执行本地事务逻辑,根据本地事务执行结果向 RocketMQ 提交二次确认(Commit 或是 Rollback),RocketMQ 收到 Commit 状态则将 Prepared 消息标记为可投递,订阅方最终将收到该消息;RocketMQ 收到 Rollback 状态则删除 Prepared 消息,订阅方将不会接受该消息

如果在上述流程的第2阶段,提交的二次确认最终未到达 RocketMQ,RocketMQ 会定时扫描消息集群中的事物消息,如果发现 Prepared 消息,会向消息发送者确认本地事务的最终执行结果;根据消息发送者的返回来决定是回滚消息还是继续发送确认消息,保证消息发送与本地事务的同时成功或失败

如果本地事务已经成功,且消息也发送成功,那么压力来到消费者这边
此时会有两个问题:消费失败和消费超时;消费超时的话,只需一直重试即可;消费失败的话,按照阿里提供的说法,需要“人工解决,RabbitMQ 并未提供回滚上述整个流程的机制

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

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

相关文章

On the Properties of Neural Machine Translation: Encoder–DecoderApproaches

摘要 Neural machine translation : 神经机器翻译。 神经机器翻译模型经常包含编码器和解码器:an encoder and a decoder. 编码器: 从一个变长输入序列中提取固定长度的表示。a fixed-length representation. 解码器:从表示中…

抖音SEO矩阵系统源码开发部署(二)技术搭建+二次开发

抖音SEO矩阵系统源码开发 是一项技术密集型工作,需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言,如Java、Python等。同时,需要使用一些框架和技术,如Hadoop、Spark、PyTorch等,以…

第五章 运输层【计算机网络】

第五章 运输层【计算机网络】 前言推荐第五章 运输层5.1运输层协议概述5.1.1 进程之间的通信5.1.2运输层的两个主要协议5.1.3运输层的端口 5.2用户数据报协议UDP5.2.1UDP概述5.2.2UDP的首部格式 5.3传输控制协议TCP概述5.3.1TCP最主要的特点5.3.2TCP的连接 5.4可靠传输的工作原…

手写操作系统--进入保护模式的开篇

之前我们讲的主引导扇区以及内核加载器等内容。都是在实模式下运行的。在实模式下寻址范围仅有1M,是远远不够我们用的。我们想要更大的内存空间,就得进入保护模式,实模式是一个历史遗留问题,本身是没有这个名字的。是因为有了保护…

【算法集训之线性表篇】Day 01

文章目录 题目知识点补充思路分析代码实现运行结果 题目 01.从顺序表中删除具有最小值元素(假设唯一)并返回被删元素的值。空出位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 知识点补充 顺序表的特点是逻辑…

CRM系统中AI如何进行销售线索评分?有什么好处(上)

每个公司的TOP销售都是精明的猎手。他们善于从大量潜在客户中挑出最可能购买的,把最好的时间、精力和资源给到高意向客户。意向度差一些的排在后面,在资源分配上也会降低。现在,您可以通过AI来进行线索评分,可以说CRM销售线索评分…

SIP 协议的主要流程

目录 SIP 协议的呼叫模型图 基本呼叫建立流程 基本呼叫拆除流程 经过代理的呼叫建立流程 经过代理的呼叫拆除流程 SIP 协议在软交换 SoftX3000(华为推出的一个支持sip协议的交换机设备) 流程图 SIP 协议的呼叫模型图 MGC 负责将 PSTN 前向信令映射…

ETHERNET/IP转MODBUS-TCP协议网关

远创智控YC-EIP-TCP 是自主研发的一款 ETHERNET/IP 从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 ETHERNET/IP 网络中。 本网关连接到 ETHERNET/IP 总线中做为从站使用,连接到 MODBUS-TCP 总线中做为主站(客户端)或从站…

淘上拼/拼上拼/抖上拼分别是什么意思(操作玩法是怎样的及数据采集代码举例)

拼多多店群玩法最常见的就是淘上拼、拼上拼、抖上拼这三种,但是很多的商家都不了解这三种玩法是什么意思,更别提操作了,本期小编就来为你们详细介绍一下。 淘上拼: 传统玩法:通过蓝海词,采集类目爆款商品数…

若依前端,菜单栏切换时刷新问题[页面菜单切换时,页面总是重新刷新,导致页面输入的查询参数重载清空]...

前端页面菜单切换时,页面总是重新刷新,导致页面输入的查询参数重载清空 这样切换时,页面就刷新了,解决方法在这里 1,页面代码,这里指定name name: "Item", 注意 name的首字母必须大写 2&#xff…

密盾科技即将推出同态加密隐私计算开源平台Pinsehub!

密盾科技预计将于8月底正式推出同态加密隐私计算平台Pinsehub-Platform。Pinsehub隐私计算平台将涵盖匿踪查询、隐私求交、联合建模、联合统计、算法容器管理、数据资源管理、数据确权与定价(开发中)、异构平台互联互通(开发中)等…

Spring中@Autowired和@Resource的区别:

文章目录 一、Autowired二、Resource三、Autowired和Resource的区别: 一、Autowired Autowired 这个注解呢,是由 Spring 提供的,它可以用来对构造方法、成员变量以及方法参数上进行标注,能够根据对象类型完成自动注入。 public …

Podman下载安装说明以及通过下载mysql镜像

Podman下载地址 Releases containers/podman GitHub csdn下载地址:https://download.csdn.net/download/u010479989/88010018 下载exe会自动添加到环境变量中,下载zip需要手动设置环境变量 初始化命令 podman machine init 这个时候会提示安装wsl&…

[工业互联-15]:Linux操作与实时Linux操作系统RT Linux( PREEMPT-RT、Xenomai)

目录 第1章 Linux操作系统 1.1 什么是Linux操作系统 1.2 Linux操作系统架构 1.3 常见Linux操作系统发行版本 第2章 实时Linux操作系统 2.1 实时性要求 2.2 实时性实现技术的基本思想 2.2 常见发行版方案 2.3 Xenomai和PREEMPT-RT比较 第3章 PREEMPT-RT 3.1 概述 3…

java调用python脚本,json传参方式。

使用python的json.loads()进行解析json数据,如果没有包含双引号,则会解析出错 解决方案1 使用demjson.decode(),安装方式直接百度,就不做过多的说明了 解决方案2 使用json.loads()方式解析,…

Jetpack Compose与Accompanist:改变Android UI开发的方式

在Android开发中,UI开发一直是一个重要的部分。Google推出的Jetpack Compose库为开发者提供了一种全新的声明式UI工具,使得UI开发变得更加简单和直观。而Accompanist库则为Jetpack Compose提供了一系列有用的扩展,进一步提升了开发效率。 Jet…

jQuery节点操作

jQuery常用技术 1.jQuery获取元素 2.jQuery与js对象转换 3.jQuery中的遍历方式 4.jQuery中的事件绑定 1. jQuery介绍 1.1 jQuery概述 在JavaScript的使用过程中,存在很多问题,例如:兼容问题(咱不考虑),元素获取方式单一(只能用基…

抖音矩阵号管理系统源码开发及布局流程

“账号矩阵”运营是一种账号运营的高阶玩法,指一个运营主体同时开设多个平台多个账号利用品牌联动的形式来实现账号之间的相关引流,以账号组的形式实现企业营销价值最大化。那么运营多个账号,短视频平台内容是核心,势必要招募多个…

前端Vue自定义精美宫格菜单按钮组件 可设置一行展示个数 可设置成九宫格 十二宫格 十五宫格

前端Vue自定义精美宫格菜单按钮组件 可设置一行展示个数 可设置成九宫格 十二宫格 十五宫格 , 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id13315 效果图如下: # cc-categoryMenu #### 使用方法 使用方法…

js实现 无限层级 树形数据结构

创建数据 const list []; for (let i 0; i < 1000; i 200) {if (i 0) {list.push({ id: i - 1, age: 年龄- (i - 1) });list.push({ id: i, age: 年龄- i, parentId: -1 });} else {for (let index i - 199; index < i; index) {list.push({ id: index, age: 年龄…