【RocketMQ系列十】RocketMQ的核心概念说明

news2024/11/26 2:36:15

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。
❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

文章目录

    • 1. 模型关系
    • 1. 主题(Topic)
      • 1.1. 主题的内部属性:
      • 1.2. 使用建议
    • 2. 队列
    • 3. 消息
      • 3.1. 消息的内部属性
    • 4. 生产者
    • 5. 消费者组
      • 5.1. 内部属性
      • 5.2. 使用建议
    • 6. 消费者
    • 7.订阅关系
      • 7.1 .订阅关系判断原则
      • 7.2 .内部属性
      • 7.3. 使用建议
    • 参考

本文将详细介绍RocketMQ中的核心概念(领域模型),包括主题,队列,消息,生产者,消费者和消费者组,订阅关系等核心概念。

1. 模型关系

在详细介绍各个领域模型之前,首先让我们整体来预览下各个模型之间的关系图。

模型关系

从图中可以看出整体关系是,生产者发送消息到某个Topic中的某个队列中,消费者通过订阅关系订阅指定Topic中消息。

1. 主题(Topic)

主题是RocketMQ中消息传输和存储的的顶层容器,用于标识同一类型业务逻辑的消息。主题只是一个逻辑概念,它并不是一个实际的消息容器。

主题的作用有两个:

  1. 定义数据的分类隔离:RocketMQ官方建议将不同业务类型的数据拆分到不同的主题中,比如线上商品购物场景下,订单交易如创建订单,支付,取消等订单消息使用同一个主题,物流相关的消息可以使用同一个主题,积分相关的消息可以使用同一个主题
  2. 定义数据的身份和权限:RocketMQ中的消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限管理。

1.1. 主题的内部属性:

  1. 主题名称:主题名称用于标识主题,主题名称在集群内部全局唯一。
  2. 队列列表:队列是主题的组成单元,是消息实际存储的容器, 一个主题下有一个或多个队列。在RocketMQ集群中实际上是通过broker来管理队列列表的。
  3. 消息类型:RocketMQ在创建主题的时候可以指定主题中存放的消息类型。默认有: Normal (普通消息),FIFO (顺序消息),Delay(定时/延迟消息),Transaction(事务消息)

1.2. 使用建议

由于主题(Topic)非常重要,RocketMQ官方建议在生产环境中不能开启自动创建主题的配置,以免产生大量垃圾主题,无法管理和回收浪费系统资源。

RocketMQ官方推荐在RocketMQ 5.0版本下使用 myadmin命令来创建主题,创建命令是:

./bin/mqadmin updateTopic -n <nameserver_address> -t <topic_name> -c <cluster_name> -a +message.type=<message_type>

nameserver_address: 是Nameserver集群的地址,比如:172.31.184.89:9876

topic_name:是主题名称

cluster_name:是broker集群的名称

message_type:表示消息类型,可以填入: Normal ,FIFO ,Delay,Transaction,不填默认就是普通消息。

比如下面创建一个名称为 feige_FIFOTopic的存放顺序消息的主题

./bin/mqadmin updateTopic -n 172.31.184.89:9876 -t feige_FIFOTopic -c rocketmq-cluster -a +message.type=FIFO

image-20231008211003777

image-20231008211127882

2. 队列

队列是RocketMQ中消息传输和存储的实际容器,是RocketMQ中消息存储的最小单元。RocketMQ中所有主题都是由多个队列组成。

队列具有天然的顺序性,即按照消息写入的顺序存入队列中。队头存的是最先写入的消息,队尾存的是最近写入的消息。

消息在队列里的顺序和消息之间的顺序通过位点(offset)来进行标记管理,RocketMQ中消息被消费会记录当前已经消费到的消息的offset,下次则从此offset位点继续消费。

RocketMQ支持在任意位点消费任意数量的消息,RocketMQ中消息在队列中被消费之后并不会随即出队列,而是会默认保留48小时,这也保证了在RocketMQ中消息可以被回溯消费,以及进行消息失败重试等操作。

一个Topic的MessageQueue中的消息只能被一个消费者组中的一个消费者消费。一个MessageQueue中的消息不允许同一个消费者组中的多个消费者同时消费。

3. 消息

消息是RocketMQ中最小的数据传输单元,生产者将需要发送的数据包装成消息发送给RocketMQ的服务端。

消息具有两大特性:

  1. 消息不可变性:消息一旦产生,消息的内容即不可改变,即使经过传输链路的控制也不会发生变化。
  2. 消息持久化:RocketMQ默认会对消息进行持久化,即消息会被保存到RocketMQ服务端的存储文件中,从而保证了消息的可回溯性和系统故障场景下的可恢复性。

3.1. 消息的内部属性

在消息被发送成功之后我们可以看到如下输出信息:

SendResult [sendStatus=SEND_OK, msgId=0A299C7A551414DAD5DC2C3A61960000, offsetMsgId=AC1FB85900002A9F00000000002D9A88, messageQueue=MessageQueue [topic=SQLFilterTest, brokerName=broker-b, queueId=2], queueOffset=2]
  1. 主题名称:当前消息所属的主题的名称。集群内全局唯一。
  2. 消息类型:当前消息的类型
  3. 消息队列(queueId):实际存储当前消息的队列
  4. 消息位点(queueOffset): 当前消息存储在队列中的位置。
  5. 消息ID(msgId):消息的唯一标识,集群内每条消息的ID全局唯一。
  6. 索引Key列表(可选):消息的索引键,可通过设置不同的key区分消息和快速查找消息
  7. 过滤标签Tag(可选):消息的过滤标签。消费者可通过Tag对消息进行过滤,仅接收指定标签的消息。
  8. 定时时间:定时场景下,消息触发延时投递的毫秒级时间戳。
  9. 消息发送时间:消息发送时,生产者客户端系统的本地毫秒级时间戳。
  10. 消息保存时间戳:消息在 RocketMQ 服务端完成存储时,服务端系统的本地毫秒级时间戳。 对于定时消息和事务消息,消息保存时间指的是消息生效对消费方可见的服务端系统时间。
  11. 消费重试次数:息消费失败后,RocketMQ 服务端重新投递的次数。每次重试后,重试次数加1。由服务端系统标记。首次消费,重试次数为0;消费失败首次重试时,重试次数为1。
  12. 消息负载:业务消息的实际报文数据。

RocketMQ限制消息大小,普通消息限制在4MB以内,事务和定时消息限制在 64KB

4. 生产者

用来构建并发送消息到RocketMQ服务端的运行实体,一般是集成到业务系统中。

生产者可以发送普通消息,顺序消息,定时消息以及事务消息。

由于创建和销毁生产比较耗费系统资源, 故RocketMQ官方不建议在单一进程中创建大量生产者。

5. 消费者组

RocketMQ系统中承载多个消费行为一致的消费者的负载均衡分组,消费者组是一个逻辑概念。

5.1. 内部属性

  1. 消费者分组名称:用于区分不同消费者分组,消费者分组名称在集群内全局唯一。
  2. 投递顺序性:消费者消费消息时, RocketMQ 向消费者客户端投递消息的顺序。
  3. 消费重试策略:消费者消费消息失败时,系统的重试策略。消费者消费消息失败时,系统会按照重试策略,将指定消息投递给消费者重新消费。
  4. 订阅关系:当前消费者分组关联的订阅关系集合。包括消费者订阅的主题,以及消息的过滤规则等。

RocketMQ通过消费者分组来实现消费者的管理,同一分组内的消费者共同分摊消息并进行消费,因此,为了保证分组内消息的正常负载和消费。RocketMQ要求同一个消费者分组下所有消费者的消费行为要保持一致。

5.2. 使用建议

  1. 分组内消费者的投递顺序一致

    同一消费者分组下所有消费者的消费投递顺序是相同的,统一都是顺序投递或并发投递,不同业务场景不能混用消费者分组。

  2. 分组内消费者的业务类型一致

    一般消费者分组和主题对应不同业务域对消息消费的要求不同,因此,不同业务域主题的消费建议使用不同的消费者分组,避免一个消费者分组消费超过10个主题。

6. 消费者

消费者是RocketMQ中用来接收并处理消息的运行实体,消费者从RocketMQ服务端获取消息并进行解析。消费者通常被集成到业务系统中。

RocketMQ中提供了推模式的消费者DefaultMQPushConsumer,以及拉模式的消费者

7.订阅关系

RocketMQ系统中消费者获取消息,处理消息的规则和状态配置。

7.1 .订阅关系判断原则

RocketMQ 的订阅关系按照消费者分组和主题粒度设计,因此,一个订阅关系指的是指定某个消费者分组对于某个主题的订阅,判断原则如下:

不同消费者分组对于同一个主题的订阅相互独立如下图所示,消费者分组Group A和消费者分组Group B分别以不同的订阅关系订阅了同一个主题Topic A,这两个订阅关系互相独立,可以各自定义,不受影响。

在这里插入图片描述

同一个消费者分组对于不同主题的订阅也相互独立如下图所示,消费者分组Group A订阅了两个主题Topic A和Topic B,对于Group A中的消费者来说,订阅的Topic A为一个订阅关系,订阅的Topic B为另外一个订阅关系,且这两个订阅关系互相独立,可以各自定义,不受影响。

订阅关系相同分组

7.2 .内部属性

  1. 过滤类型

    消息过滤规则的类型。订阅关系中设置消息过滤规则后,系统将按照过滤规则匹配主题中的消息,只将符合条件的消息投递给消费者消费,实现消息的再次分类。

    • TAG过滤:按照Tag字符进行全文过滤匹配。
    • SQL92过滤:按照SQL语法对消息属性进行过滤匹配。
    1. 过滤表达式
    • 自定义的过滤规则表达式。

7.3. 使用建议

  1. 建议不要频繁修改订阅关系。

参考

https://rocketmq.apache.org/zh/docs/domainModel/01main

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

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

相关文章

【计网 DNS】计算机网络 DNS协议详解:中科大郑烇老师笔记 (六)

目录 0 引言1 DNS概述1.1 定义1.2 DNS域名结构1.2 域名解析步骤 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计算机网络&#xff08;一&#xff09;、计算机网络&…

初始Redis 分布式结构的发展演变

目录 Redis的特点和使用场景 分布式系统的引入 单机系统 分布式系统 应用服务器的增多&#xff08;处理更多的请求&#xff09; 数据库读写分离&#xff08;数据服务器的增多) 引入缓存 应对更大的数据量 业务拆分&#xff1a;微服务 Redis的特点和使用场景 我们先来…

使用 Rust 和 cURL 库下载程序

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; ​ use std::io::{self, Read}; use std::error::Error; ​ fn main() {let url "https://www.baidu.com";let …

04-HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器&#xff0c;每种收集器都有各自的特点&#xff0c;虽然我们要对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器&…

如何将表格内容拆分至多列内容

如何将表格内容拆分至多列内容 需求示例步骤1.找到“分列”2.选择“分隔符号&#xff08;D&#xff09;”3.设置分隔符号4.完成5.分隔后的内容 总结 需求 表格的某一列里有很多内容&#xff0c;想将该列内容拆分到多列里&#xff0c;并能准确的显示拆分后的每一列内容 示例 …

【Java 进阶篇】Java XML约束:确保数据一致性和有效性

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;用于存储和交换数据。然而&#xff0c;为了确保数据的一致性和有效性&#xff0c;通常需要定义XML约束。XML约束是一种规则集&#xff0c;定义了XML文档的结构、元素、属性和数据类型。本篇博客…

RobotRules 和UserAgent来下载文件

以下是一个使用WWW::RobotRules和LWP::UserAgent来下载文件的Perl程序&#xff1a; #!/usr/bin/perl ​ use strict; use warnings; use WWW::RobotRules; use LWP::UserAgent; use HTTP::Request; use HTTP::Response; ​ my $url http://www.people.com.cn/; my $agent LW…

结构体学习

struct是结构体关键字 我们用C语言中通常都是用关键字来定义类型变量。例如我们的整型变量&#xff0c;int book;是用整型关键字定义出来的。同样的&#xff0c;struct book同样是一个类型&#xff0c;不过我们叫他结构体。我认为的结构体的作用&#xff0c;无外乎是将一些毫…

APU的Vsense引脚的作用

开关电源PCB布局注意事项 开关电源PCB布线注意事项 一.Sense电压检测(FB) “Sense+”和“Sense-”,就是四线制中的电压检测线,high-sense 和low-sense分别连接远端负载的正负极,监测电源电压,抵消长距离传输线引起的电压损耗。这两个Sense接线端的作用简而言之就是调整Ou…

centos如何根据端口号查询程序路径

centos如何根据端口号查询程序路径 如果是半路接受的应用&#xff0c;上个人只给你说了程序的端口号&#xff0c;别的都没&#xff0c;那怎么找程序的路径哪&#xff1f;一是给上上个人要&#xff0c;二是自己找&#xff08;我是自己找的&#xff09; 小白教程&#xff0c;一…

链表的中间结点-力扣

1、题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海…

【STM32】标准库与HAL库对照学习系列教程大全

【STM32】标准库与HAL库对照学习系列教程大全 一、前言二、准备工作三、基础篇四、进阶篇五、特别篇六、外设篇 一、前言 前言&#xff1a;开始工作后&#xff0c;学习的时间变少了很多&#xff0c;但是今年的1024节&#xff0c;还是打算送个福利给大家&#xff0c;将之前的STM…

PR BeatEdit 节奏卡点神器 的报错 beat detection error: IBT failed 和解决路径

环境&#xff1a;DELL Latitude 笔记本 16G内衬&#xff0c;Win10&#xff0c;PR 2021&#xff0c;BeatEdit Pr 2.1.003 安装PR BeatEdit 节奏卡点神器没有问题&#xff0c;可以调出。 导入音频时报错&#xff1a;beat detection error: IBT failed 根据 BeatEdit for Premi…

【Unity程序技巧】 资源加载管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

ScrapeKit 和 Swift 编写程序

以下是一个使用 ScrapeKit 和 Swift 编写的爬虫程序&#xff0c;用于爬取 图片。同时&#xff0c;我们使用了proxy 这段代码来获取代理。 import ScrapeKit ​ class PeopleImageCrawler: NSObject, ScrapeKit.Crawler {let url: URLlet proxyUrl: URL ​init(url: URL, proxy…

概率论_概率公式中的分号(;)、逗号(,)、竖线(|) 及其优先级

目录 1.概率公式中的分号(;)、逗号(,)、竖线(|) 2.各种概率相关的基本概念 2.1 联合概率 2.2 条件概率&#xff08;定义&#xff09; 2.3 全概率(乘法公式的加强版) 2.4 贝叶斯公式 贝叶斯定理的公式推导 1.概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类…

uview1.0部分机型u-input组件禁用后无法触发click事件

最近&#xff0c;线上的一个 App 收到用户反馈&#xff0c;输入框禁用状态下点击无法拉起模态框。找了一下身边可用机型进行了测试&#xff0c;起初所有机型都没有复现这个问题&#xff0c;突然有一天 Redmi K30S Ultra 出现了异常&#xff0c;点击输入框无法触发点击事件&…

分享几个bug发现手段-final chk、default test、stress test、fault injection

本文发散式分享几个有效的bug发现手段或者验证方法。 一、final chk final chk的思想是在执行完成一个测试用例&#xff08;或者一个简单的命令&#xff09;之后&#xff0c;然后查看下当前设计DUT的状态。比如说一个cacheline&#xff0c;在完成一笔read/write之后&#xff0c…

6、centos7安装DNS服务器结合Nginx Proxy Manager实现局域网自定义域名解析

前言 我想在物理主机&#xff08;windows11)、虚拟机&#xff08;CentOS7)、虚拟机上部署的k8s集群所在的局域网内实现自定义域名的访问&#xff0c;通过Nginx Proxy Manager反向代理。 最终效果&#xff1a;在Nginx Proxy Manager的页面配置的域名能准确解析到代理的目标主机…

【Rust】4 一文讲解重点 pattern matching | trait | 生命周期 | 闭包 | 迭代器 | 智能指针 | 并发与并行

文章目录 一、pattern matching二、trait2.1 常见 trait2.1.1 Copy 和 Clone2.1.2 PartialEq 和 Eq2.1.3 PartialOrd 和 Ord2.1.4 Hash2.1.5 From, Into, TryFrom, TryInto 2.2 概念2.2.1 关联类型2.2.2 关联常量2.3.3 泛型关联类型2.3.3.1 示例: 用泛型关联类型, 创建集合工厂…