RocketMQ(一):基本概念
RocketMQ官方文档地址:RocketMQ官网文档地址。
一、什么是RocketMQ
RocketMQ是一款分布式、队列模型的消息中间件。
二、RocketMQ的基本概念
2.1、Topic - 主题
Topic是RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息,通过TopicName来做唯一标识和区分。
2.2、Message Type - 消息类型
RocketMQ 中按照消息传输特性的不同而定义的分类,用于类型管理和安全校验。 RocketMQ 支持的消息类型有普通消息、顺序消息、事务消息和定时/延时消息。
2.3、MessageQueue - 消息队列
MessageQueue是 RocketMQ 中消息存储和传输的实际容器,也是消息的最小存储单元。 RocketMQ 的主题是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储。队列通过QueueId来做唯一标识和区分。
2.4、Message - 消息
Message是 RocketMQ 中的最小数据传输单元。生产者将业务数据的负载和拓展属性包装成消息发送到服务端,服务端按照相关语义将消息投递到消费端进行消费。
2.5、MessageView - 消息视图
MessageView是 RocketMQ 面向开发视角提供的一种消息只读接口。通过消息视图可以读取消息内部的多个属性和负载信息,但是不能对消息本身做任何修改。
2.6、MessageTag - 消息标签
MessageTag是 RocketMQ 提供的细粒度消息分类属性,可以在主题层级之下做消息类型的细分。消费者通过订阅特定的标签来实现细粒度过滤。
2.7、MessageQueueOffset - 消息位点
消息是按到达Apache RocketMQ 服务端的先后顺序存储在指定主题的多个队列中,每条消息在队列中都有一个唯一的Long类型坐标,这个坐标被定义为消息位点。
2.8、ConsumerOffset - 消费位点
一条消息被某个消费者消费完成后不会立即从队列中删除,RocketMQ 会基于每个消费者分组记录消费过的最新一条消息的位点,即消费位点。
2.9、MessageKey - 消息索引
MessageKey是 RocketMQ 提供的面向消息的索引属性。通过设置的消息索引可以快速查找到对应的消息内容。
2.10、Producer - 生产者
1、什么是生产者
生产者(Producer):RocketMQ 中用于产生消息的运行实体。
生产者是 RocketMQ 系统中用来构建并传输消息到服务端的运行实体。生产者通常被集成在业务系统中,将业务消息(Message)按照要求封装成消息并发送至服务端。
2、生产者的传输行为
·发送方式
生产者可通过API接口设置消息发送的方式。Apache RocketMQ 支持同步传输和异步传输。
·批量发送
生产者可通过API接口设置消息批量传输的方式。例如,批量发送的消息条数或消息大小。
·事务行为
Apache RocketMQ 支持事务消息,对于事务消息需要生产者配合进行事务检查等行为保障事务的最终一致性
3、生产者与主题的关系
生产者和主题的关系为多对多关系,即同一个生产者可以向多个主题发送消息,对于平台类场景如果需要发送消息到多个主题,并不需要创建多个生产者;同一个主题也可以接收多个生产者的消息,以此可以实现生产者性能的水平扩展和容灾。
2.11、TransactionChecker - 事务检查器
RocketMQ 中生产者用来执行本地事务检查和异常事务恢复的监听器。事务检查器应该通过业务侧数据的状态来检查和判断事务消息的状态。
2.11、TransactionResolution - 事务状态
RocketMQ 中事务消息发送过程中,事务提交的状态标识,服务端通过事务状态控制事务消息是否应该提交和投递。事务状态包括事务提交、事务回滚和事务未决。
2.12、ConsumerGroup - 消费者分组
ConsumerGroup是 RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。与消费者不同,消费者分组并不是运行实体,而是一个逻辑资源。
在 RocketMQ 中,通过消费者分组内初始化多个消费者实现消费性能的水平扩展以及高可用容灾。
2.13、Consumer - 消费者
Consumer是 RocketMQ 中用来接收并处理消息的运行实体。消费者通常被集成在业务系统中,从服务端获取消息,并将消息转化成业务可理解的信息,供业务逻辑处理。
2.14、ConsumeResult - 消费结果
RocketMQ 中PushConsumer消费监听器处理消息完成后返回的处理结果,用来标识本次消息是否正确处理。消费结果包含消费成功和消费失败。
2.15、Subscription - 订阅关系
订阅关系是 RocketMQ 系统中消费者获取消息、处理消息的规则和状态配置。
订阅关系由消费者分组动态注册到服务端系统,并在后续的消息传输中按照订阅关系定义的过滤规则进行消息匹配和消费进度维护。
2.16、消息过滤
消费者可以通过订阅指定消息标签(Tag)对消息进行过滤,确保最终只接收被过滤后的消息合集。过滤规则的计算和匹配在 RocketMQ 的服务端完成。
2.17、重置消费位点
以时间轴为坐标,在消息持久化存储的时间范围内,重新设置消费者分组对已订阅主题的消费进度,设置完成后消费者将接收设定时间点之后,由生产者发送到Apache RocketMQ 服务端的消息。
2.18、消息轨迹
在一条消息从生产者发出到消费者接收并处理过程中,由各个相关节点的时间、地点等数据汇聚而成的完整链路信息。
通过消息轨迹,能清晰定位消息从生产者发出,经由 RocketMQ 服务端,投递给消费者的完整链路,方便定位排查问题。
2.19、消息堆积
生产者已经将消息发送到Apache RocketMQ 的服务端,但由于消费者的消费能力有限,未能在短时间内将所有消息正确消费掉,此时在服务端保存着未被消费的消息,该状态即消息堆积。
2.20、事务消息
事务消息是 RocketMQ 提供的一种高级消息类型,支持在分布式场景下保障消息生产和本地事务的最终一致性。
2.21、定时/延时消息
定时/延时消息是 RocketMQ 提供的一种高级消息类型,消息被发送至服务端后,在指定时间后才能被消费者消费。通过设置一定的定时时间可以实现分布式场景的延时调度触发效果。
2.22、顺序消息
顺序消息是 RocketMQ 提供的一种高级消息类型,支持消费者按照发送消息的先后顺序获取消息,从而实现业务场景中的顺序处理。
三、参数约束及建议
参数 |
建议范围 |
说明 |
Topic名称 |
字符建议:字母a~z或A~Z、数字0~9以及下划线(_)、短划线(-)和百分号(%)。长度建议:1~64个字符。 |
Topic命名应该尽量使用简短、常用的字符,避免使用特殊字符。特殊字符会导致系统解析出现异常,字符过长可能会导致消息收发被拒绝 |
ConsumerGroup名称 |
字符建议:字母a~z或A~Z、数字0~9以及下划线(_)、短划线(-)和百分号(%)。长度建议:1~64个字符。 |
- |
ACL Credentials |
字符建议:AK(AccessKey ID)、SK(AccessKey Secret)和Token仅支持字母a~z或A~Z、数字0~9。 长度建议:不超过1024个字符 |
- |
请求超时时间 |
默认值:3000毫秒。 取值范围:该参数为客户端本地行为,取值范围建议不要超过30000毫秒。 |
请求超时时间是客户端本地同步调用的等待时间,请根据实际应用设置合理的取值,避免线程阻塞时间过长。 |
消息大小 |
默认值:不超过4 MB。不涉及消息压缩,仅计算消息体body的大小。 取值范围:建议不超过4 MB。 |
消息传输应尽量压缩和控制负载大小,避免超大文件传输。若消息大小不满足限制要求,可以尝试分割消息或使用OSS存储,用消息传输URL。 |
消息自定义属性 |
字符限制:所有可见字符。
长度建议:属性的Key和Value总长度不超过16 KB。 |
- |
MessageGroup |
字符限制:所有可见字符。
长度建议:1~64字节。 |
MessageGroup是顺序消息的分组标识。一般设置为需要保证顺序的一组消息标识,例如订单ID、用户ID等。 |
消息发送重试次数 |
默认值:3次。
取值范围:无限制。 |
消息发送重试是客户端SDK内置的重试策略,对应用不可见,建议取值不要过大,避免阻塞业务线程。 如果消息达到最大重试次数后还未发送成功,建议业务侧做好兜底处理,保证消息可靠性。 |
消息消费重试次数 |
默认值:16次。 |
消费重试次数应根据实际业务需求设置合理的参数值,避免使用重试进行无限触发。重试次数过大容易造成系统压力过量增加。 |
事务异常检查间隔 |
默认值:60秒。 |
事务异常检查间隔指的是,半事务消息因系统重启或异常情况导致没有提交,生产者客户端会按照该间隔时间进行事务状态回查。 间隔时长不建议设置过短,否则频繁的回查调用会影响系统性能。 |
半事务消息第一次回查时间 |
默认值:取值等于[事务异常检查间隔] 最大限制:不超过1小时。 |
无 |
半事务消息最大超时时长 |
默认值:4小时。 取值范围:不支持自定义修改。 |
半事务消息因系统重启或异常情况导致没有提交,生产者客户端会按照事务异常检查间隔时间进行回查,若超过半事务消息超时时长后没有返回结果,半事务消息将会被强制回滚。 |
PushConsumer本地缓存 |
默认值:
最大缓存数量:1024条。 最大缓存大小:64 M。
取值范围:支持用户自定义设置,无限制。 |
消费者类型为PushConsumer时,为提高消费者吞吐量和性能,客户端会在SDK本地缓存部分消息。缓存的消息的数量和大小应设置在系统内存允许的范围内。 |
PushConsumer重试间隔时长 |
默认值: 非顺序性投递:间隔时间阶梯变化 顺序性投递:3000毫秒。 |
无。 |
PushConsumer消费并发度 |
默认值:20个线程。 |
无。 |
获取消息最大批次 |
默认值:32条。 |
消费者从服务端获取消息时,一次获取到最大消息条数。建议按照实际业务设置合理的参数值,一次获取消息数量过大容易在消费失败时造成大批量消息重复。 |
SimpleConsumer最大不可见时间 |
默认值:用户必填参数,无默认值。
取值范围建议:最小10秒;最大12小时。 |
消费不可见时间指的是消息处理+失败后重试间隔的总时长,建议设置时取值比实际需要耗费的时间稍微长一些。 |