SocketMQ Producer消息发送流程
检测消息的合法性:
- topic名称是否包含非法字符
- topic名称长度是否超过限制(127个字符)
- message是否为null是否为空消息
- message消息体是否大于最大长度(4M)
获取topic详情
- 首先获取内存中维护的一份Map获取,如果没有的话会从NameServer的接口获取数据,然后更新到map中
- 获取的topic元数据包含:topic的路由信息,topic下broker相关信息
选择具体的MessageQueue
- MessageQueue选择机制:获取一个随机数与MessageQueue数量取模,决定选择哪个queue,再找到这个queue所在的broker
- 容错机制下的选择逻辑:如果开启了路由发现的Broker失败隔离和Broker超时隔离,则会过滤掉不可用的Broker再进行选择
- 正常情况下的选择逻辑:每次发送都会将queue的broker与上一次选的进行对比,保证选择和上一次不一样的Broker,避免数据倾斜
- 发送流程
选择到了具体的MessageQueue就会底层调用Netty接口将消息发送出去