RocketMQ之消息发送
1. 认识RocketMQ消息
Message的基础属性
1. 消息所属主题topic
2. 消息Flag
3. 扩展属性
tag 消息TAG,用于消息过滤
keys Message索引键,多个用空格隔开,RocketMQ可以根据这些key快速检索到消息
waitStoreMsgOK 消息发送时是否等消息存储完成后再返回
delayTimeLevel 消息延迟级别,用于定时消息或消息重试
4. 消息体
2. 生产者启动流程
1. 检查productGroup是否符合要求;并改变生产者的instanceName为进程ID
2. 创建MQClientInstance实例
3. 向MQClientInstance注册,将当前生产者加入到MQClientInstance管理中,方便后续调用网络请求,进行心跳检测等
4. 启动MQClientInstance,如果MQClientInstance已经启动,则本次启动不会真正执行。
3. 消息发送基本流程
1. 消息长度验证
确保生产者处于运行状态,然后验证消息是否符合相应的规范,具体的规范要求是主题名称,消息体不能为空,消息长度不能等于0且默认不能超过允许发送消息的最大长度4M
2. 查找主题路由信息
首先获取主题的路由信息,只有获取了这些信息我们才知道消息要发送到具体的Broker节点。
如果生产者中缓存了topic的路由信息,如果该路由信息中包含了消息队列,则直接返回该路由信息,如果没有缓存或没有包含消息队列,则向NameServer查询该topic的路由信息。如果最终未找到路由信息,则抛出异常:无法找到主题相关路由信息异常。
3. 选择消息队列
根据路由信息选择消息队列,返回额消息队列按照broker,序号排序。
1. 两种方式
1. 默认机制(不启用Broker故障延迟机制)
2. Broker故障延迟机制
4. 消息发送
1. 根据消息队列获取broker的网络地址
2. 为消息分配全局唯一ID,如果消息体默认超过4K,会对消息体采用zip压缩
3. 如果注册了消息发送钩子函数,则执行消息发送之前的增强逻辑
4. 构建消息发送请求包。主要包含以下信息:生产者组,主题名称,默认创建主题key,该主题在单个Broker默认队列数,队列ID,消息系统标记,消息发送时间,消息标记,消息扩展属性,消息重试次数,是否是批量消息等。
5. 根据消息发送方式,同步,异步,单向方式进行网络传输。
6. 如果注册了消息发送钩子函数,执行after逻辑。
5. 批量消息发送
批量消息发送是将同一主题的多条消息一起打包发送到消息服务器,减少网络调用次数,提高网络传输效率。当然不是同一批次中发送的消息数量越多性能就越好,其判断依据是单条消息的长度,不能超过消息最大长度。

浙公网安备 33010602011771号