本文介绍云消息队列 RocketMQ 版中消息(Message)的定义、模型关系、内部属性、行为约束及使用建议。
定义
消息是云消息队列 RocketMQ 版中的最小数据传输单元。生产者将业务数据的负载和拓展属性包装成消息发送到云消息队列 RocketMQ 版服务端,服务端按照相关语义将消息投递到消费端进行消费。
云消息队列 RocketMQ 版的消息模型具备如下特点:
- 消息不可变性
消息本质上是已经产生并确定的事件,一旦产生后,消息的内容不会发生改变。即使经过传输链路的控制也不会发生变化,消费端获取的消息都是只读消息视图。
- 消息持久化
云消息队列 RocketMQ 版会默认对消息进行持久化,即将接收到的消息存储到云消息队列 RocketMQ 版服务端的存储文件中,保证消息的可回溯性和系统故障场景下的可恢复性。
模型关系
在整个云消息队列 RocketMQ 版的领域模型中,消息所处的流程和位置如下:

- 消息由生产者初始化并发送到云消息队列 RocketMQ 版服务端。
- 消息按照到达云消息队列 RocketMQ 版服务端的顺序存储到队列中。
- 消费者按照指定的订阅关系从云消息队列 RocketMQ 版服务端中获取消息并消费。
消息内部属性
系统保留属性
业务自定义属性
消息负载
行为约束
消息大小不得超过其类型所对应的限制,否则消息会发送失败。
系统默认的消息最大限制如下:
- 普通和顺序消息:4 MB
- 事务和定时或延时消息:64 KB
使用建议
单条消息不建议传输超大负载
作为一款消息中间件产品,云消息队列 RocketMQ 版一般传输的是都是业务事件数据。单个原子消息事件的数据大小需要严格控制,如果单条消息过大容易造成网络传输层压力,不利于异常重试和流量控制。
生产环境中如果需要传输超大负载,建议按照固定大小做报文拆分,或者结合文件存储等方法进行传输。
消息中转时做好不可变设计
云消息队列 RocketMQ 版服务端5.x版本中,消息本身不可编辑,消费端获取的消息都是只读消息视图。
但在历史版本3.x和4.x版本中消息不可变性没有强约束,因此如果您需要在使用过程中对消息进行中转操作,务必将消息重新初始化。
- 正确使用示例如下:
Message m = Consumer.receive(); Message m2= MessageBuilder.buildFrom(m); Producer.send(m2);
- 错误使用示例如下:
Message m = Consumer.receive(); m.update(); Producer.send(m);
该文章对您有帮助吗?
- 本页导读 (1)
- 定义
- 模型关系
- 消息内部属性
- 系统保留属性
- 业务自定义属性
- 消息负载
- 行为约束
- 使用建议
- 单条消息不建议传输超大负载
- 消息中转时做好不可变设计