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