RocketMQ(二):领域模型(生产者、消费者)

news2024/11/18 7:37:43

1 生产者(Producer)

        本节介绍Apache RocketMQ 中生产者的定义、模型关系、内部属性、版本兼容和使用建议。

1.1 定义

        生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。

        生产者通常被集成在业务系统中,将业务消息按照要求封装成Apache RocketMQ 的消息并发送值服务端。

        在消息生产者中,可以定义如下传输行为:

        1、发送方式:生产者可通过API接口设置消息发送的方式。Apache RocketMQ 支持同步和异步传输。        

        2、批量发送:生产者可以通过API接口设置消息批量传输的方式。例如,批量发送的消息条数或消息大小。

        3、事务行为:Apache RocketMQ 支持事务消息,对于事物消息需要生产者配合进行事务检查等行为保障事务的最终一致性。

        生产者和主题为多对多关系 ,即同一个生产者可以向多个主题发送消息,对于平台类场景如果需要发送消息到多个主题,并不需要创建多个生产者;同一个主题也可以接收多个生产者的消息,以此实现生产者性能的水平扩展和容灾。

1.2 模型关系

        在Apache RocketMQ 领域模型中,生产者的位置和流程如下:

        1、消息由生产者初始化并发送到Apache RocketMQ 服务端。

        2、消息按照达到Apache RocketMQ 服务端的顺序存储到主题的指定队列中。

        3、消费者按照指定的订阅关系从Apache RocketMQ 服务端中获取消息并消费。

1.3 内部属性

        客户端ID

                定义:生产者客户端的标识,用于区分不同的生产者。集群内全局唯一。

                取值:客户端ID由Apache RocketMQ 的SDK自动生成,主要用于日志查看,问题定位等运维场景,不支持修改。

        通信参数

                接入点信息(必选):链接服务端的接入地址,用于识别服务端集群。接入点必须按格式配置,建议使用域名,避免使用IP地址,防止节点变更无法进行热点迁移。

                身份认证信息(可选):客户端用于身份验证的凭证信息。仅在服务端开启身份识别和认证时需要传输。

                请求超时时间(可选):客户端网络请求调用的超时时间。

        预绑定主题列表

                定义:Apache RocketMQ 的生产者需要将消息发送到的目标主题列表,主要作用如下:

                1 事务消息(必须设置):事务消息场景下,生产者在故障、重启恢复时,需要检查事务消息的主题中是否有未提交的事务消息。避免生产者发送新消息后,主题中的旧事务消息一直处于未提交状态,造成业务延迟。

                2 非事务消息(建议设置):服务端会在生产者初始化时根据预绑定主题列表,检查目标主题的访问权限和合法性,而不需要等待应用启动后再检查。

                若未设置,或后续消息发送的目标主题动态变更,Apache RocketMQ 会对目标主题进行动态补充校验。

                约束:对于事务消息,预绑定列表必须设置,且需要和事务检查器一起配合使用。

        事务检查器

                定义:Apache RocketMQ 的事务消息机制中,为保证异常场景下事务的最终一致性,生产者需要主动实现事务检查器的接口。

                发送事务消息时,事务检查器必须设置,且需要和预绑定主题列表一起配合使用。

        发送重试策略

                定义:生产者在消息发送失败时的重试策略。

1.4 版本兼容性

        Apache RocketMQ 服务端5.x版本开始,生产者是匿名的,无需管理生产者分组(ProducerGroup);对于历史版本服务端3.x和4.x版本,已经使用的生产者分组可以废弃无需再设置,且不会对当前业务产生影响。

1.5 使用建议

        不建议单一进程创建大量生产者

        Apache RocketMQ 的生产者和主题是多对多关系,支持同一个生产者向多个主题发送消息。对于生产者的创建和初始化,建议遵循够用即可、最大化复用原则,如果有需哟发送消息到多个主题的场景,无需为每个主题都创建一个生产者。

        不建议频繁创建和销毁生产者

        Apache RocketMQ 的生产者是可以重复利用的底层资源,类似数据库的连接池。因此不需要每次发送消息时动态创建生产者,且在发送结束后销毁生产者。频繁的创建和销毁生产者会在服务端产生大量的短连接请求,严重影响系统性能。

2 消费者分组(ConsumerGroup)

        本节介绍Apache RocketMQ 中消费者分组(ConsumerGroup)的定义、模型关系、内部属性、行为约束、版本兼容及使用建议。

2.1 定义

        消费者分组是Apache RocketMQ 系统中承载多个消费者行为一致的消费者的负载均衡分组。和消费者不同,消费者分组并不是运行实体,而是一个逻辑资源。在Apache RocketMQ中,通过消费者分组内初始化多个消费者实现消费性能的水平扩展以及高可用容灾。

        在消费者分组中,统一定义以下消费行为,同一个分组下的多个消费者将按照分组内统一的消费行为和负载均衡策略消费信息。

        (1)订阅关系:Apache RocketMQ以消费者分组的粒度管理订阅关系,实现订阅关系的管理和追溯。

        (2)投递顺序性:Apache RocketMQ的服务端将消息投递给消费者消费时,支持顺序投递和并发投递,投递方式在消费者分组中统一配置。

        (3)消费重试策略:消费者消费信息失败的重试策略,包括重试次数、死信队列设置等。

2.2 模型关系

        在Apache RocketMQ的领域模型中,消费者分组的位置和流程如下:

      

        1、消息由生产者初始化并发送到Apache RocketMQ服务端。

        2、消息按照到达Apache RocketMQ服务端的顺序存储到主题的指定队列中。

        3、消费者按照指定的订阅关系从Apache RocketMQ服务端获取消息并消费。

2.3 内部属性

        消费者分组名称

        · 定义:消费者分组的名称,用于区分不同的消费者分组。集群内全局唯一。

        · 取值:消费者分组由用户设置并创建。

        投递顺序性

        · 定义:消费者消费消息时,Apache RocketMQ向消费者客户端投递消息的顺序。

                根据不同的消费场景,Apache RocketMQ提供顺序投递和并发投递两种方式。

        · 取值:默认投递方式是并发投递。

        消费重试策略

        · 定义:消费者消费消息失败时,系统的重试策略。消费者消费消息失败时,系统会按照重试策略,将指定消息投递给消费者重新消费。

        · 取值:重试策略包括:

                1、最大重试次数:表示消息可以被重新投递的最大次数,超过最大次数还没有被成功消费,消息讲被投递至死信队列或丢弃。

                2、重试间隔:Apache RocketMQ服务端重新投递消息的间隔时间。

        · 约束:重试间隔仅在PushConsumer消费类型下有效。

        订阅关系

        · 定义:当前消费者分组的订阅关系集合。包括消费者订阅的主题、以及消息的过滤规则。订阅关系由消费者动态注册到消费者分组中,Apache RocketMQ服务端会持久化订阅关系并匹配消息的消费进度。

2.4 行为约束

        在Apache RocketMQ领域模型中,消费者的管理通过消费者分组实现,同一分组内的消费者共同分摊消息进行消费。因此,为了保证分组内消息的正常负载和消费,Apache RocketMQ要求同一分组下的所有消费者以下消费行为保持一致。

        投递顺序和消费重试策略。

2.5 使用建议

        按照业务合理拆分分组

        Apache RocketMQ的消费者和主题是多对多的关系,对于消费者分组的拆分设计,建议遵循以下原则:

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

        2、消费者业务类型一致:一般消费者分组和主题对应,不同业务领域对消息消费的要求不同,例如消息过滤属性、消费重试策略不同。因此,不同业务领域主题的消费建议使用不同的消费者分组,避免一个消费者分组消费超过10个主题。

        消费者分组管理尽量避免自动化机制

        在Apache RocketMQ架构中,消费分组属于状态管理的逻辑资源,每个消费分组都会涉及关联的消费状态、堆积信息、可观测指标和监控采集数据。因此,生产环境需要严格管理消费者分组资源,请勿随意进行增删改查操作。

        Apache RocketMQ 虽然提供了自动创建消费者分组的功能,但是建议仅在测试环境使用,生出环境请勿打开,避免产生大量消费者分组,无法管理和回收,且浪费系统资源。

3 消费者(Consumer)

        本节介绍Apache RocketMQ中消费者的定义、模型关系、内部属性、行为约束和使用建议。

3.1 定义

        消费者是Apache RocketMQ中用来接收并处理消息的运行实体。消费者通常被定义在业务系统中,从Apache RocketMQ服务端获取消息,并将消息转化成业务可理解的信息,供业务逻辑处理。在消息服务端,可以定义如下传输行为:

        1、消费者身份:消费者必须关联一个指定的消费者分组,以获取分组内统一定义的行为配置和消费状态。

        2、消费者类型:Apache RocketMQ 面向不同的并发场景提供了多样的消费者类型,包括PushConsumer类型、SimpleConsumer类型、PullConsumer类型(仅推荐流处理场景使用)等。

        3、消费者本地运行配置:消费者感根据不同的消费者类型,控制消费者客户端本地的运行配置。例如消费者客户端的线程数、消费并发度等,实现不同的传输效果。

3.2 模型关系

        在Apache RocketMQ的领域模型中,消费者的位置和流程如下:

        1、消息由生产者初始化并发送到Apache RocketMQ服务端。

        2、消息按照到达Apache RocketMQ服务端的顺序存储到主题的指定队列中。

        3、消费者按照指定的订阅关系从Apache RocketMQ服务端中获取消息并消费。

3.3 内部属性

        消费者分组名称

        · 定义:当前消费者关联的消费者分组名称,消费者必须关联到指定的消费者分组,通过消费者分组获取消费行为。

        · 取值:消费者分组为Apache RocketMQ的逻辑资源,需要提前通过控制台或API创建。

        客户端ID

        · 定义:消费者客户端的标识,用于区分不同的消费者。集群内全局唯一。

        · 取值:客户端ID由Apache RocketMQ 的SDK自动生成,主要用于日志查看、问题定位等运维场景,不支持修改。

        通信参数

        · 接入点信息(必选):连接服务端的接入地址,用于识别服务端集群。接入点必须按格式配置,建议使用域名,避免使用IP地址,防止节点变更无法进行热点迁移。

        · 身份认证信息(可选):客户端用于身份验证的凭证信息。仅在服务端开启身份识别和认证时需要传输。

        · 请求超时时间(可选):客户端网络请求调用的超时时间。

        预绑定订阅关系列表

        · 定义:指定消费者的订阅关系列表。Apache RocketMQ 服务端可在消费者初始化阶段,根据预绑定的订阅关系列表对目标主题进行权限以及合法性校验,无需等到应用启动后才能校验。

        · 取值:建议在消费者初始化阶段明确订阅关系即要订阅的主题列表,若未设置,或订阅的主题动态变更,Apache RocketMQ 会对目标主题进行动态补充校验。

        消费者监听器

        · 定义:Apache RocketMQ服务端将消费推送给消费者后,消费者调用消息消费逻辑的监听器。

        · 取值:由消费者客户端本地配置。

3.4 行为约束

        在Apache RocketMQ领域模型中,消费者的管理通过消费者分组实现,同一分组内的消费者共同分摊消息进行消费。因此,为了保证分组内消息的正常负载和消费。

        Apache RocketMQ要求同一分组内的消费者以下消费行为保持一致:

        投递顺序和消费者重试策略。

3.5 使用建议

        不建议在单一进程内创建大量的消费者

        Apache RocketMQ的消费者在通信协议层面支持非阻塞传输模式,网络通信效率较高,并且支持多线程并发访问。因此,大部分场景下,单一进程内同一个消费分组只需要初始化唯一的一个消费者即可,开发过程中应避免以相同的配置初始化多个消费者。

        不建议频繁创建和销毁消费者

        Apache RocketMQ的消费者是可以重复利用的底层资源,类似数据库的连接池。因此不需要在每次接收消息时动态创建消费者,且在消费者完成后销毁消费者。这样频繁地创建销毁会在服务端产生大量短连接请求,严重影响系统性能。

4 订阅关系(Subscription)

        本节介绍Apache RocketMQ中订阅关系的定义、模型关系、内部属性和使用建议。

4.1 定义

        订阅关系是Apache RocketMQ系统中消费者获取消息、处理消息的规则和状态配置。

        订阅关系由消费者分组动态注册到服务端系统,并在后续的消息传输中按照订阅关系定义的过滤规则进行消息匹配和消费进度维护。

        通过配置订阅关系,可控制如下传输行为:

        · 消息过滤规则:用于控制消费者在消费消息时,选择主题内的哪些消息进行消费,设置消费过滤规则可以高效地过滤消费者需要的消息集合,灵活根据不同的业务场景设置不同的消息接收范围。

        · 消费状态:Apache RocketMQ服务端默认提供订阅关系持久化的能力,即消费者分组在服务端注册订阅关系后,当消费者离线并再次上线后,可以获取离线前的消费进度并继续消费。

4.2 订阅关系判断原则

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

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

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

4.3 模型关系

        在Apache RocketMQ的领域模型中,订阅关系的位置和流程如下;

        1、消息由生产者初始化并发动到Apache RocketMQ服务端。

        2、消息按照到达Apache RocketMQ服务端的顺序存储到主题的指定队列中。

        3、消费者按照指定的订阅关系从Apache RocketMQ服务端获取消息并消费。

4.4 内部属性

        过滤类型

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

        · 取值:

        TAG过滤:按照Tag字符串进行全文过滤匹配。

        SQL92过滤:按照SQL语法对消息属性进行过滤匹配。

        过滤表达式

        · 定义:自定义的过滤规则表达式。

4.5 行为约束

        订阅关系一致

        Apache RocketMQ 是按照消费者分组粒度管理订阅关系,因此,同一消费者分组内的消费者在消费逻辑上必须保持一致,否则会出现消费冲突,导致部分消息消费异常。

4.6 使用建议

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

        在Apache RocketMQ领域模型中,订阅关系关联了过滤规则、消费进度等元数据和相关配置,同时系统需要保证消费者分组下的所有消费者的消费行为、消费逻辑、负责策略等一致,整体运算逻辑比较复杂。因此,不建议在生成环境中通过频繁修改订阅关系来实现业务逻辑的变更,这样可能会导致客户端一直处于负载均衡调整和变更的过程,从而影响消息接收。

                

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

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

相关文章

C语言KR圣经笔记 7.1标准输入和输出 7.2格式化输出-printf

第七章 输入和输出 输入和输出功能并不是 C 语言本身的一部分,故到目前为止,本书都没有对其着重说明。然而,程序与其环境之间交互的方式,比书中之前所展示的更为复杂。本章我们会详描述标准库,即一系列为 C 程序提供输…

EMC学习笔记(二十一)降低EMI的PCB设计指南(一)

降低EMI的PCB设计指南(一) 1.概述2.射频3.连接器与过孔元件4.静态引脚和动态引脚和输入5.基本回路6.差模与共模 tips:资料主要来自网络,仅供学习使用。 1.概述 印刷电路板(PCB)的一般布局准则,基本上都有相对的文件进…

应用层 HTTP协议(1)

回顾 前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点. 这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析 版本 首先我们谈谈HTTP协议的版本 HTTP 0.9 (1991) HTTP 1.0 (1992 - 1…

阿里云游戏服务器多少钱一年?

阿里云游戏服务器租用价格表:4核16G服务器26元1个月、146元半年,游戏专业服务器8核32G配置90元一个月、271元3个月,阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价: 阿里云游戏服务器租用价格表 阿…

C++ 水仙花数

案例描述:水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身例如: 1A35A33A3153 请利用do.…while语句,求出所有3位数中的水仙花数 分析思路: 1、将所有的三位数进行输出(100~999&#x…

SPSSAU上线文本分析啦|“尔滨”旅游攻略文本分析

一、什么是文本分析? 作为一种新兴的基于定性研究的量化分析方法,文本分析法能够揭示文本的变化与特征,为经典问题的研究提供了新思路。 文本分析应用于多个领域,比如在旅游业中,可以通过文本分析去研究旅游形象感知…

动态规划的一个初步学习

啥叫动态规划 在我们写很多的题目时,常常可以用暴力枚举来写,缺点就是速度太慢了。如果我们用一个数组或者哈希表(虽然我还没学过哈希表)将之前暴力枚举的数据储存起来,当再一次枚举到这个数字的时候就直接调用数组或…

异构计算关键技术之mmap

异构计算关键技术之mmap 一、背景 1. 日志存储系统 case 1:分布式日志存储系统,是一个基于raft协议自研分布式日志存储系统,logstore则是底层存储引擎。 logstore中,使用mmap对数据文件读写。 logstore的存储结构简化如下图&a…

请问半吊子 C++选手该如何深入学习 C++?

请问半吊子 C选手该如何深入学习 C? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&#xff0…

清空队列的方法

注意&#xff1a;C中的队列queue自身不支持clear操作&#xff0c;但双端队列deque是支持clear操作的。 方法一&#xff1a;直接用空的队列对象赋值 代码&#xff1a; queue<int> q; qqueue<int>(); 方法二&#xff1a;遍历出队列 代码&#xff1a; while(!q…

VitePress-14- 配置-titleTemplate 的作用详解

作用描述 1、titleTemplate 是标题的后缀&#xff1b;2、可以自定义标题的后缀&#xff1b;3、可以自定义整个的标题以及后缀&#xff0c;语法如下&#xff1a; titleTemplate: :title 链接符号 自己定义的后缀 【:title】&#xff1a;从页面的第一个 <h1> 标题推断出的…

《计算思维导论》笔记:10.4 关系模型-关系运算

《大学计算机—计算思维导论》&#xff08;战德臣 哈尔滨工业大学&#xff09; 《10.4 关系模型-关系运算》 一、引言 本章介绍数据库的基本数据模型&#xff1a;关系模型-关系运算。 二、什么是关系运算 在数据库理论中&#xff0c;关系运算&#xff08;Relational Operatio…

【开源】SpringBoot框架开发校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

Open CASCADE学习|保存为STL文件

STL (Stereolithography) 文件是一种广泛用于3D打印和计算机辅助设计 (CAD) 领域的文件格式。它描述了一个三维模型的表面而不包含颜色、材质或其他非几何信息。STL文件通常用于3D打印过程中&#xff0c;因为它们仅包含构建物体所需的位置信息。 由于STL文件只包含表面信息&am…

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

Days 27 ElfBoard 板 AltiumDesigner 相同电路快速布局布线

在进行设计开发的时候&#xff0c;总会遇到相同的电路&#xff0c;或者模块&#xff0c;这些电路可以使用相同的布局和走线&#xff0c;例如 DC-DC 电源、网口 PHY 电路部分。这类型的电路&#xff0c;我们可以采用AltiumDesigner 中的 Room 进行布局和布线的快速复制&#xff…

c语言数据类型定义错误导致的数据溢出或者死循环

数据溢出问题 #include <stdio.h>/* 数据溢出 */int main() {char i; // 数据表示范围[-128,127] 0xf0 ~ 0x7ffor(i0;i<130;i) // {printf("%d ",i);}return 0; }/* 编译运行上面的程序&#xff0c;你会发现程序陷入了死循环&#xff0c;一直在不断…

多模态知识图谱:感知与认知的交汇

目录 前言1 多模态知识图谱的概念1.1 感知系统与认知系统的连接1.2 信息形式的整合与融合1.3 全面、多维度的认知基础 2 多模态的作用2.1 模态的知识互补2.2 模态实体消歧2.3 模态语义搜索2.4 知识图谱补全2.5 多模态任务增强 3 多模态知识图谱发展历史3.1 初期模态数据整合3.2…

Vue源码系列讲解——虚拟DOM篇【四】(优化更新子节点)

目录 1. 前言 2. 优化策略介绍 3. 新前与旧前 4. 新后与旧后 5. 新后与旧前 6. 新前与旧后 7. 回到源码 8. 总结 1. 前言 在上一篇文章中&#xff0c;我们介绍了当新的VNode与旧的oldVNode都是元素节点并且都包含子节点时&#xff0c;Vue对子节点是 先外层循环newChil…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…