RocketMQ消息发送

110 阅读2分钟

1、消息体的封装

字段类型说明内容举例
topicString消息所属主题skuCreated(商品创建mq)
flagint消息flagRocketMQ对此不做处理
propertiesMap消息的拓展信息见表格下方
msgbyte[]消息体要发送的消息

注:properties补充:

  1. tag:消息tag,用于消息过滤;
  2. keys:消息索引,多个空格分割的字符串,RocketMQ用这些key快速检索消息;
  3. waitStoreMsgOK:消息发送是否等待消息存储完成之后才返回;
  4. delayTimeLevel:消息延迟级别,用与定时消息或消息重试;
  5. 其他

疑问:

  1. 在peopertise中什么时候放入keys?,RocketMQ使用者放还是RocketMQ自己放?,放的是什么?,怎么实现消息索引?
  2. waitStoreMsgOK,发送一条消息之后一直等到RocketMQ存储完毕是说存储到磁盘?如果是这样MQ消息发送会很慢吧?

2、发送消息流程

  1. 消息长度验证
  2. 查找主题路由信息
  3. 选择消息队列
  4. 消息发送

消息长度验证

  1. 消息topic不能为空,且有效
  2. 消息体不能为空,消息体长度不能大于最大值
  3. 其他

查找主题路由信息

  1. 发送消息前,获取topic的路由信息(先从本地缓存获取,获取不到时从NameServer获取),决定消息发送到具体的broker节点

路由信息大概长什么样子?

TopicPublishinfo

字段说明
orderTopic是否顺序消息
List主题的消息队列
TopicRouteDatatopic的路由信息

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和队列,从里面找,基于此做消息发送的高可用就好。