消息队列
本节介绍 Apache RocketMQ 中消息队列的定义、模型关系和内部属性。本主题还提供消息队列的版本兼容性信息和使用注意事项。
定义
队列是 Apache RocketMQ 中用于存储和传输消息的容器。队列是 Apache RocketMQ 消息存储的最小单位。
Apache RocketMQ 中的主题包含多个队列。这样,队列支持水平分区和流式存储。
队列提供以下优势
有序存储 队列本质上是有序的:消息以入队顺序存储。最早的消息位于队列的开头,最新的消息位于队列的末尾。偏移量用于标记队列中消息的位置和顺序。
流式操作语义:Apache RocketMQ 中基于队列的存储允许消费者从某个偏移量读取一个或多个消息。这有助于实现诸如聚合读取和回溯读取等功能。这些功能在 RabbitMQ 或 ActiveMQ 中不可用。
模型关系
下图显示了队列在 Apache RocketMQ 领域模型中的位置。
默认情况下,Apache RocketMQ 提供可靠的消息存储。所有成功传递的消息都持久存储在队列中。消息由生产者发送,由消费者客户端接收。每条消息至少可以成功传递一次。
Apache RocketMQ 的队列模型类似于 Kafka 的分区模型。在 Apache RocketMQ 中,队列是主题的一部分。即使消息由主题管理,它们也是在队列中进行操作的。例如,当生产者向特定主题发送消息时,消息将发送到该主题中的队列。
您可以更改 Apache RocketMQ 中的队列数量以进行横向扩展或缩容。
内部属性
读写权限
定义:是否可以从当前队列读取或写入数据。
值:由代理定义。以下是枚举说明
6:读写。可以向当前队列写入消息并从中读取消息。
4:只读。可以从当前队列读取消息,但不能写入消息。
2:只写。可以向当前队列写入消息,但不能从中读取消息。
0:读写状态不可用。当前队列不允许读写操作。
- 约束:读写权限与 O\&M 操作相关。建议您不要频繁修改权限。
行为约束
每个主题包含一个或多个用于存储消息的队列。每个主题中的队列数量与消息类型和实例所在的区域有关。队列数量不可更改。
版本兼容性
队列名称根据 Apache RocketMQ 代理的版本而有所不同。以下是差异说明
代理版本 3.x 和 4.x:队列名称由主题名称、代理 ID 和队列 ID 组成,并绑定到物理节点。
代理版本 5.x:队列名称是集群分配的全局唯一字符串,与物理节点解耦。
建议您不要构造队列名称或将其绑定到其他操作。否则,在更新代理时,可能无法解析队列名称。
使用注意事项
队列数量设置
在创建或更改主题时,可以在 Apache RocketMQ 中指定队列数量。建议您配置少量队列,并避免添加不需要的队列。
以下是由于主题中队列数量过多而导致的问题说明
- 集群中元数据量增加 Apache RocketMQ 基于队列收集指标和监控数据。大量队列可能会导致元数据量增加。
- 客户端负载过重 Apache RocketMQ 中的消息读取和写入是基于队列进行的。大量队列可能会生成空闲轮询请求,从而增加系统负载。
添加队列的场景
物理节点的负载均衡
Apache RocketMQ 中每个主题的队列可以分布到不同的服务节点。为了确保集群扩展后集群流量的负载均衡,建议您添加队列或将以前的队列迁移到新的服务节点。
与 fifo 消息相关的性能瓶颈问题
在 Apache RocketMQ 代理版本 4.x 中,fifo 消息仅在队列中生效。因此,fifo 消息的并发性取决于队列数量。建议您在系统出现性能瓶颈问题时增加队列数量。