1、消息体的封装
| 字段 | 类型 | 说明 | 内容举例 |
|---|---|---|---|
| topic | String | 消息所属主题 | skuCreated(商品创建mq) |
| flag | int | 消息flag | RocketMQ对此不做处理 |
| properties | Map | 消息的拓展信息 | 见表格下方 |
| msg | byte[] | 消息体 | 要发送的消息 |
注:properties补充:
- tag:消息tag,用于消息过滤;
- keys:消息索引,多个空格分割的字符串,RocketMQ用这些key快速检索消息;
- waitStoreMsgOK:消息发送是否等待消息存储完成之后才返回;
- delayTimeLevel:消息延迟级别,用与定时消息或消息重试;
- 其他
疑问:
- 在peopertise中什么时候放入keys?,RocketMQ使用者放还是RocketMQ自己放?,放的是什么?,怎么实现消息索引?
- waitStoreMsgOK,发送一条消息之后一直等到RocketMQ存储完毕是说存储到磁盘?如果是这样MQ消息发送会很慢吧?
2、发送消息流程
- 消息长度验证
- 查找主题路由信息
- 选择消息队列
- 消息发送
消息长度验证
- 消息topic不能为空,且有效
- 消息体不能为空,消息体长度不能大于最大值
- 其他
查找主题路由信息
- 发送消息前,获取topic的
路由信息(先从本地缓存获取,获取不到时从NameServer获取),决定消息发送到具体的broker节点
路由信息大概长什么样子?
TopicPublishinfo
| 字段 | 说明 |
|---|---|
| orderTopic | 是否顺序消息 |
| List | 主题的消息队列 |
| TopicRouteData | topic的路由信息 |
TopicRouteData
| 字段 | 说明 |
|---|---|
| List< QueueData> | topic队列元数据 |
| List< BrokerData> | topic分布的broker元数据 |
关于数据流转的猜测性描述
TopicRouteData,作为元数据,被producer(消息生产机器存储在本地缓存),数据来源是NameServer上存储的某种数据结构的数据,这部分数据在同步到producer的时候被转换成了TopicRouteData格式。
TopicRouteData作为原始数据,producer使用起来也不是很方便,它对数据进行了重新的组织,被转成了TopicPublishinfo的List< MessageQueue>
大概长的像下面这样
[
{
"brokerName":"broker-a",
"queueId":0
//...
},
{
//....
}
]
选择消息队列
List< MessageQueue> 就是最终被选择的broker和队列,从里面找,基于此做消息发送的高可用就好。