RocketMQ基本概念

news2024/11/16 20:26:49

RocketMQ

一 引言

Message Queue(消息 队列),从字⾯上理解:⾸先它是⼀个队列。先进先出的数据结构——队列。消息队列就是所谓的存放消息的队列。

消息队列解决的不是存放消息的队列的⽬的,解决的是通信问题;⽐如以电商订单系统为例,如果各服务之间使⽤同步通信,不仅耗时较久,且过程中受到⽹络波动的影响,不能保证⾼成功率。因此可以使⽤异步的通信⽅式对架构进⾏改造;使⽤异步的通信⽅式对模块间的调⽤进⾏解耦,可以快速的提升系统的吞吐量。上游执⾏完消息的发送业务后⽴即获得结果,下游多个服务订阅到消息后各⾃消费。通过消息队列,屏蔽底层的通信协议,使得解藕和并⾏消费得以实现。

MQ的作用:异步解耦流量削峰

几种常见消息队列的对比

在这里插入图片描述

二 RocketMQ的基本概念

1 技术架构

在这里插入图片描述

RocketMQ架构上主要分为四部分,如上图所示:

  1. Producer:消息发布的⻆⾊,⽀持分布式集群⽅式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进⾏消息投递,投递的过程⽀持快速失败并且低延迟

  2. Consumer:消息消费的⻆⾊,⽀持分布式集群⽅式部署。⽀持以push推pull拉两种模式对消息进⾏消费。同时也⽀持集群⽅式和⼴播⽅式的消费,它提供实时消息订阅机制,可以满⾜⼤多数⽤户的需求

  3. NameServer:NameServer是⼀个⾮常简单的Topic路由注册中⼼,其⻆⾊类似Dubbo中的zookeeper,⽀持Broker的动态注册与发现。主要包括两个功能:

    1. Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据然后提供⼼跳检测机制,检查Broker是否还存活;
    2. 路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和⽤于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从⽽进⾏消息的投递和消费。

    NameServer通常也是集群的⽅式部署,各实例间相互不进⾏信息通讯。Broker是向每⼀台NameServer注册⾃⼰的路由信息,所以每⼀个NameServer实例上⾯都保存⼀份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息

  4. BrokerServer:Broker主要负责消息的存储、投递和查询以及服务⾼可⽤保证,为了实现这些功能,Broker包含了以下⼏个重要⼦模块。

    1. Remoting Module:整个Broker的实体,负责处理来⾃clients端的请求。
    2. Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息Store Service:提供⽅便简单的API接⼝处理消息存储到物理硬盘和查询功能。
    3. HA Service:⾼可⽤服务,提供Master Broker 和 Slave Broker之间的数据同步功能。
    4. Index Service:根据特定的Message key对投递到Broker的消息进⾏索引服务,以提供消息的快速查询。

在这里插入图片描述

2 部署架构

在这里插入图片描述

RocketMQ ⽹络部署特点

  1. NameServer是⼀个⼏乎⽆状态节点,可集群部署,节点之间⽆任何信息同步。
  2. Broker部署相对复杂,Broker分为Master与Slave,⼀个Master可以对应多个Slave,但是⼀个Slave只能对应⼀个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义BrokerId为0表示Master,⾮0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建⽴⻓连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上⽀持⼀Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。
  3. Producer与NameServer集群中的其中⼀个节点(随机选择)建⽴⻓连接,定期从NameServer获取Topic路由信息,并向提供Topic 服务的Master建⽴⻓连接,且定时向Master发送⼼跳。Producer完全⽆状态,可集群部署。
  4. Consumer与NameServer集群中的其中⼀个节点(随机选择)建⽴⻓连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master、Slave建⽴⻓连接,且定时向Master、Slave发送⼼跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最⼤偏移量的距离(判断是否读⽼消息,产⽣读I/O),以及从服务器是否可读等因素建议下⼀次是从Master还是Slave拉取。

结合部署架构图,描述集群⼯作流程:

  1. 启动NameServer,NameServer起来后监听端⼝,等待Broker、Producer、Consumer连上来,相当于⼀个路由控制中⼼。
  2. Broker启动,跟所有的NameServer保持⻓连接,定时发送⼼跳包。⼼跳包中包含当前Broker信息(IP+端⼝等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系
  3. 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时⾃动创建Topic
  4. Producer发送消息,启动时先跟NameServer集群中的其中⼀台建⽴⻓连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择⼀个队列,然后与队列所在的Broker建⽴⻓连接从⽽向Broker发消息
  5. Consumer跟Producer类似,跟其中⼀台NameServer建⽴⻓连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建⽴连接通道,开始消费消息。

三 消息种类

1 简单消息

简单消息分成三种:同步消息异步消息单向消息

1.1 同步消息

⽣产者发送消息后,必须等待broker返回信息后才继续之后的业务逻辑,在broker返回信息之前,⽣产者阻塞等待。

同步消息的应⽤场景:如重要通知消息、短信通知、短信营销系统等。

1.2 异步消息

⽣产者发完消息后,不需要等待broker的回信,可以直接执⾏之后的业务逻辑。⽣产者提供⼀个回调函数供broker调⽤,体现了异步的⽅式。

异步传输⼀般⽤于响应时间敏感的业务场景。

1.3 单向消息

⽣产者发送完消息后不需要等待任何回复,直接进⾏之后的业务逻辑,单向传输

⽤于需要中等可靠性的情况,例如⽇志收集。

2 顺序消息

顺序消息指的是消费者消费消息的顺序按照发送者发送消息的顺序执⾏。顺序消息分成两种:局部顺序消息全局顺序消息

2.1 局部顺序消息

局部消息指的是消费者消费某个topic的某个队列中的消息是顺序的。

消费者使⽤MessageListenerOrderly类做消息监听,实现局部顺序。

2.2 全局顺序消息

消费者消费全部消息都是顺序的,只能通过某个topic只有⼀个队列才能实现,

这种应⽤场景较少,且性能较差。

2.3 乱序消费

消费者消费消息不需要关注消息的顺序。消费者使⽤MessageListenerConcurrently类做消息监听。

3 ⼴播消息

⼴播是向主题(topic)的所有订阅者发送消息。订阅同⼀个topic的多个消费者,能全量收到⽣产者发送的所有消息

4 延迟消息

延迟消息与普通消息的不同之处在于,它们要等到指定的时间之后才会被传递。

延迟等级:RocketMQ设计了18个延迟等级,分别是

1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 1

等级3对应的是10s。系统为这18个等级配置了18个topic,⽤于实现延迟队列的效果。

在商业版RocketMQ中,不仅可以设置延迟等级,还可以设置具体的延迟时间,但是在社区版RocketMQ中,只能设置延迟等级。

5 批量消息

批量发送消息提⾼了传递⼩消息的性能。

官⽅建议批量消息的总⼤⼩不应超过1m,实际不应超过4m。如果超过4m的批量消息需要进⾏分批处理,同时设置broker的配置参数为4m(在broker的配置⽂件中修改: maxMessageSize=4194304

使⽤限制:同⼀批次的消息应该具有相同的主题相同的 waitStoreMsgOK并且不⽀持延迟消息事务消息

6 过滤消息

在⼤多数情况下,标签是⼀种简单⽽有⽤的设计,可以⽤来选择您想要的消息。

消费者将收到包含 TAGA 或 TAGB 或 TAGC 的消息。但是限制是⼀条消息只能有⼀个标签,这可能不适⽤于复杂的场景。在这种情况下,您可以使⽤ SQL 表达式来过滤掉消息。

使⽤限制:只有推模式的消费者可以使⽤SQL过滤。拉模式是⽤不了的

使⽤SQL过滤

SQL 功能可以通过您在发送消息时输⼊的属性进⾏⼀些计算。在 RocketMQ 定义的语法下,可以实现⼀些有趣的逻辑。这是⼀个例⼦:

------------
| message |
|----------| a > 5 AND b = 'abc'
| a = 10 | --------------------> Gotten
| b = 'abc'|
| c = true |
------------
------------
| message |
|----------| a > 5 AND b = 'abc'
| a = 1 | --------------------> Missed
| b = 'abc'|
| c = true |
------------

RocketMQ 只定义了⼀些基本的语法来⽀持这个特性,也可以轻松扩展它,语法如下:

  1. 数值⽐较,如>, >=, <, <=, BETWEEN, =;
  2. 字符⽐较,如=, <>, IN;
  3. IS NULLIS NOT NULL
  4. 逻辑AND, OR, NOT;

常量类型有:

  1. 数字,如 123、3.1415;
  2. 字符,如’abc’,必须⽤单引号;
  3. NULL,特殊常数;
  4. 布尔值,TRUEFALSE

7 事务消息

事务消息的定义:它可以被认为是⼀个两阶段的提交消息实现,以确保分布式系统的最终⼀致性。事务性消息确保本地事务的执⾏和消息的发送可以原⼦地执⾏。

事务消息有三种状态:

  1. TransactionStatus.CommitTransaction:提交事务,表示允许消费者消费该消息。
  2. TransactionStatus.RollbackTransaction:回滚事务,表示该消息将被删除,不允许消费。
  3. TransactionStatus.Unknown:中间状态,表示需要MQ回查才能确定状态

事务消息的实现流程

在这里插入图片描述

使⽤限制

  1. 事务性消息没有调度和批处理⽀持
  2. 为避免单条消息被检查次数过多,导致半队列消息堆积,我们默认将单条消息的检查次数限制为15次,但⽤户可以通过更改“transactionCheckMax”来更改此限制”参数在broker的配置中,如果⼀条消息的检查次数超过“transactionCheckMax”次,broker默认会丢弃这条消息,同时打印错误⽇志。⽤户可以通过重写“AbstractTransactionCheckListener”类来改变这种⾏为
  3. 事务消息将在⼀定时间后检查,该时间由代理配置中的参数“transactionTimeout”确定。并且⽤户也可以在发送事务消息时通过设置⽤户属性“CHECK_IMMUNITY_TIME_IN_SECONDS”来改变这个限制,这个参数优先于“transactionMsgTimeout”参数。
  4. ⼀个事务性消息可能会被检查或消费不⽌⼀次
  5. 提交给⽤户⽬标主题的消息reput可能会失败。⽬前,它取决于⽇志记录。⾼可⽤是由 RocketMQ 本身的⾼可⽤机制来保证的。如果要保证事务消息不丢失,保证事务完整性,推荐使⽤同步双写机制。
  6. 事务性消息的⽣产者 ID 不能与其他类型消息的⽣产者 ID 共享。与其他类型的消息不同,事务性消息允许向后查询。MQ 服务器通过其⽣产者 ID 查询客户端。

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

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

相关文章

C语言实现顺序表--数据结构

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…

项目管理中引入PMO的应用研究——以H研究所为例

摘 要 本文从项目管理办公室&#xff08;PMO&#xff09;的基本内涵出发&#xff0c;探讨了PMO在以“项目”为主要工作组织方式的H研究所应用过程中发挥的作用、具有的优势、取得的成效与存在的不足&#xff0c;从而实现为企业培养专业的项目经理团队&#xff0c;为业务部门定…

Ubuntu20.04安装CUDA和CUDNN

CUDA是GPU深度学习的运行库&#xff0c;那么cuDNN就是训练加速工具&#xff0c;两者要相互配合使用&#xff0c;所以一般机器学习需要训练引擎(tensorflow-gpu) CUDA cuDNN使用。想不安装cuDNN是不可以的&#xff0c;而且cuDNN版本要和CUDA版本相互搭配。 1、前置工作 查看…

最新动态 | 大势智慧参加广东省应急测绘保障与安全生产演练

4月20日&#xff0c;2023年度广东省应急测绘保障与安全生产演练在台山市赤溪镇鱼塘湾举行。本次演练由广东自然资源厅主办&#xff0c;广东省国土资源测绘院、江门市自然资源局和台山市人民政府承办。在省市各指导单位与参演单位的多方协同与指挥下&#xff0c;应急测绘保障与安…

常用PLC学习资料下载地址

常见PLC的资料一般在官网都可以找到&#xff0c;今天整理一下&#xff0c;把西门子、三菱、欧姆龙、汇川四家品牌的官方下载地址直接贴出来供大家直接使用。 1、汇川技术官方网站 汇川技术 - 推进工业文明 共创美好生活 (inovance.com)https://www.inovance.com/2、汇川技术资料…

TCP重传、滑动窗口、流量控制、拥塞控制

目录 重传机制 #超时重传 SACK 方法 Duplicate SACK 滑动窗口 流量控制 窗口关闭 拥塞控制 慢启动 拥塞避免算法 拥塞发生 快速恢复 重传机制 TCP 实现可靠传输的方式之一&#xff0c;是通过序列号与确认应答。 在 TCP 中&#xff0c;当发送端的数据到达接收主机时…

rancher部署flink集群

rancher版本&#xff1a;v2.6.8 k8s版本&#xff1a;v1.22.13rke2r1 flink集群版本&#xff1a;1.15.0 flink安装模式&#xff1a;session cluster 写在前面&#xff1a;因为参照官网的说明安装过程中出现了很多问题&#xff0c;特记录于此&#xff0c;避免后续重复踩坑 目…

FE_CSS 精灵图技术 字体图标 CSS三角

一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减少服务器接收和发送请求的次数&a…

国内申请日本专利有哪些流程?

日本2004年修订的实用新型法已经于2005年4月1日生效&#xff0c;在日本&#xff0c;“专利”这一概念限于发明&#xff0c;实用新型和外观设计均不称为专利。实用新型授权后&#xff0c;就叫实用新型权&#xff0c;并不叫专利权。而且&#xff0c;发明、实用新型和外观设计是“…

掘金Tiktok电商比亚马逊刺激多了

鑫优尚电子商务&#xff1a;万亿跨境电商市场&#xff0c;聚光灯照在了Tiktok&#xff08;抖音海外版&#xff09;身上。 美国、巴西、俄罗斯、越南……2017年年末才正式出海的Tiktok&#xff0c;仅在2年后便覆盖了150个国家和地区&#xff0c;多次登顶App Store下载量首位。 …

使用 Vaex 处理具有 2 亿行的数据集

在这篇文章中,我们生成了 2 亿条时序人工数据,有 4 列,大小接近 12GB。使用 Pandas 库无法读取数据集并对其进行探索和可视化。与 pandas 相比,能够将字符串处理速度提高10-1000 倍。比spark快近十倍。 Pandas是用于数据科学案例研究的最受欢迎的库之一。它是探索性数据分…

rtthread默认网卡的操作

设置网卡优先级 在 RT-Thread 操作系统中&#xff0c;可以通过修改网卡的优先级来设置默认网卡。优先级越高的网卡会被优先选择为默认网卡。 下面介绍一些设置默认网卡优先级的方法&#xff1a; 在 RT-Thread 的网络配置文件 rtconfig.h 中&#xff0c;可以通过修改 NETIF_P…

SAP CAP篇一:快速创建一个Service,基于Java的实现

这个博客上&#xff0c;还没有写过SAP技术栈的东西&#xff0c;这次开个头&#xff0c;写个最近研究SAP CAP的摸索过程。虽然SAP CAP&#xff08;Cloud Application Model&#xff09;关注在Cloud的开发&#xff0c;我这些文章里面还是偏重本地上的尝试。 文章目录 前置内容现在…

当Kotlin Flow与Channel相逢

Flow之所以用起来香&#xff0c;Flow便捷的操作符功不可没&#xff0c;而想要熟练使用更复杂的操作符&#xff0c;那么需要厘清Flow和Channel的关系。 本篇文章构成&#xff1a; 1. Flow与Channel 对比 1.1 Flow核心原理与使用场景 原理 先看最简单的Demo&#xff1a; fun…

编写 LuCI CBI 模型

编写 LuCI CBI 模型 CBI模型是描述UCI配置文件结构的Lua文件&#xff0c;并且CBI解析器将lua文件转为HTML呈现给用户 。 所有 CBI 模型文件都必须返回类型为luci.cbi.Map的对象。 CBI 模型文件的范围由 luci.cbi 模块的内容和 luci.i18n 的转换函数自动扩展。 CBI控件类型汇总 …

如何使用ESP32-CAM构建一个人脸识别系统

有许多人识别系统使用签名、指纹、语音、手部几何、人脸识别等来识别人&#xff0c;但除了人脸识别系统。 人脸识别系统不仅可以用于安全目的来识别公共场所的人员&#xff0c;还可以用于办公室和学校的考勤目的。 在这个项目中&#xff0c;我们将使用 ESP32-CAM 构建一个人脸识…

eclipse for abap下载及配置安装

一&#xff0c;下载eclipse &#xff0c;地址 https://www.eclipse.org/downloads/download.php?file/oomph/epp/2023-03/R/eclipse-inst-jre-win64.exe 可以选择(大连东软信息学院)端口下载&#xff0c;这样开一些&#xff0c; 二&#xff1a;双击安装&#xff0c;安装FOR…

放弃手动测试,快来了解JMeter压测神器的安装和使用吧~~

目录&#xff1a;导读 引言 jmeter的安装 JMeter是干什么的 JMeter都可以做那些测试 JMeter的使用和组件介绍 下面我们进行XML格式的实战练习 jmeter与postman的区别 JSON的插件 另附视频教程资源 引言 你是否曾经为手动测试而苦恼&#xff1f;是不是觉得手动测试太费…

Windows Java JavaFX Idea 开发环境搭建

博文目录 文章目录 JavaFX 简单说明JavaFX 版本说明JavaFX 与 JDK 的关系JavaFX 与 JDK Modular (JDK 9 模块化系统)JavaFX 模块说明 (JavaFX 20)JavaFX Scene Builder构建 JavaFX 应用程序的两种选择 环境搭建 建议先阅读下方引用的官方文档, 与本章节做相互印证与理解版本选…

Vue 3组件传值 、组件通信

本文采用<script setup />的写法&#xff0c;比options API更自由。那么我们就来说说以下七种组件通信方式&#xff1a; props emit v-model refs provide/inject eventBus vuex/pinia 举个例子 本文将使用下面的演示&#xff0c;如下图所示&#xff1a; 上图中…