开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):消息发送5-总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12475
消息发送5-总结
整个消息发送的主要方法,就是在DefaultMQProducerImpl 这个里面进行一个处理。
最终会走到sendDefaultmpl(msg.sync.null.time.out)方法里。这里用了默认的时间是三秒钟,在发送信息的时候,先去校验消息的合法性。包括消息的程度等等,如果消息合法,它就开始发消息。
在发送过程中首先先去查找路由信息,通过TrytoFindTopicPublishinfo去发送,再去查找路由。
怎么查找路由?在客户端的本地缓存了一个topic publish路由的信息,它先从本地查,如果本地查出来了,那就直接使用本地的路由去发送。
如果本地没有路由怎么办?它就去通过MQclient instance去请求name server,通过name server查找当前topic所对应的路由信息,这一步是去查找路由。
路由查找出来之后,就要开始发送消息,最终消息是要发送到message queen这个消息队列当中。
发送的消息对列里rocket M Q做了一个故障延迟机制的处理,如果打开了故障延迟的机制,那么它在再去发送信息的时候先根据当前这个message queen,维护了一个索引,通过这个索引对message queen进行一个取模,取出message queen,取出来之后进行校验。
如果它是可用的,那就直接返回,如果是不可用的,从它之前所发送过的故障表当中取出一个相对比较好的信息再去发送它。
如果这里面没有打开故障延迟机制,那就直接使用它。所以对这个message queen进行一个取模,直接返回。
第三步就是选择这个消息队列。选择了这个消息对列之后,接下来就要发送,在发送时,首先获取broker的网络地址,对message进行I D的设置,判断一下当前这个消息是否要去压缩,再去判断是否有发送之前的增强逻辑,如果有就把这个增强逻辑,其实就是一个钩子方法,将它进行执行。
整个都完成了之后,去封装请求包,通过MQclient的实力向外发送消息。
整个消息的发送流程为以下四步:
1. 验证消息
2. 查找路由
3. 选择队列
4. 发送消息
5.