1. 检测消息的合法性:

    • topic名称是否包含非法字符
    • topic名称长度是否超过限制(127个字符)
    • message是否为null是否为空消息
    • message消息体是否大于最大长度(4M)
  2. 获取topic详情

    • 首先获取内存中维护的一份Map获取,如果没有的话会从NameServer的接口获取数据,然后更新到map中
    • 获取的topic元数据包含:topic的路由信息,topic下broker相关信息
  3. 选择具体的MessageQueue

    • MessageQueue选择机制:获取一个随机数与MessageQueue数量取模,决定选择哪个queue,再找到这个queue所在的broker
    • 容错机制下的选择逻辑:如果开启了路由发现的Broker失败隔离和Broker超时隔离,则会过滤掉不可用的Broker再进行选择
    • 正常情况下的选择逻辑:每次发送都会将queue的broker与上一次选的进行对比,保证选择和上一次不一样的Broker,避免数据倾斜
  4. 发送流程

    选择到了具体的MessageQueue就会底层调用Netty接口将消息发送出去

标签: none

添加新评论