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