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.  批量消息发送

        批量消息发送是将同一主题的多条消息一起打包发送到消息服务器,减少网络调用次数,提高网络传输效率。当然不是同一批次中发送的消息数量越多性能就越好,其判断依据是单条消息的长度,不能超过消息最大长度。

 

                                

posted @ 2024-01-18 14:52  奋斗史  阅读(16)  评论(0)    收藏  举报