✅108、构建好的Producer是如何启动准备好相关资源的
构建好的Producer是如何启动准备好相关资源的?
上一次我们讲了一个承上启下的过程,就是NameServer已经启动,Broker已经启动以及完成了向NameServer的注册。
NameServer也会关注集群里的每个Broker的心跳,看Broker是否出现故障,然后我们说到,此时我们初始化出来了一个Producer组件,这些过程都是没问题的。
那么今天我们重点来分析一下这个Producer组件在启动的时候是如何准备好相关资源的,因为他必须内部得有独立的线程资源,还有得跟Broker建立网络连接,这样才能把我们的消息发送出去。
首先我想告诉大家的是,其实我们在构造Producer的时候,他内部构造了一个真正用于执行消息发送逻辑的组件,就是DefaultMQProducerImpl这个类的实例对象,所以其实我们要知道,真正的生产组件其实是这个组件。
那么这个组件在启动的时候都干了什么呢?
其实这里要告诉大家的一点是,如果我们在这里贴出来这个组件启动的源码,你会发现有大量的源码篇幅,他实际上在启动的时候做了大量的工作。
但是如果我们这里逐行逐行的去分析这个组件启动的源码,可能并没有什么必要,因为大量琐碎的启动和初始化的源码即使你现在看了也没太大的意义。很多东西我们都可以在后续的各种MQ使用场景的源码分析中去讲解,不用现在来看。
所以今天这篇文章我们其实不如去分析一些有意思的事情,主要站在Producer的核心行为的角度去看。
首先我们都知道一件事儿,假设我们后续要通过Producer发送消息,必然会指定我们要往哪个Topic里发送消息。所以我们也知道,Producer必然是知道Topic的一些路由数据的,比如Topic有哪些MessageQueue,每个MessageQueue在哪些Broker上。
我们其实看下面的一幅图,图里就表示出了,这个发送消息的时候必须要知道Topic路由数据的一个概念。

那么现在问题来了,到底是Producer刚启动初始化的时候,就会去拉取每个Topic的路由数据呢?还是等你第一次往一个Topic发送消息的时候再拉取路由数据呢?
其实答案是显而易见的,肯定不可能是刚初始化启动的时候就拉取Topic的路由数据,因为你刚开始启动的时候,不知道要发送消息到哪个Topic去啊!
所以这个问题,一定是在你第一次发送消息到Topic的时候,才会去拉取一个Topic的路由数据,
- 包括这个Topic有几个MessageQueue;
- 每个MessageQueue在哪个Broker上;
- 然后从中选择一个MessageQueue,跟那台Broker建立网络连接,发送消息过去。
所以此时我们说第二个问题,Producer发送消息必然要跟Broker建立网络,这个是在Producer刚启动的时候就立马跟所有的Broker建立网络连接吗?
那必然也不是的,因为此时你也不知道你要跟哪个Broker进行通信。
所以其实很多核心的逻辑,包括Topic路有数据拉取,MessageQueue选择,以及跟Broker建立网络连接,通过网络连接发送消息到Broker去,这些逻辑都是在Producer发送消息的时候才会有。
所以我们根本没有必要对Producer的初始化过程做太过于详细的分析,那会让人陷入一大坨源码的细节,弄的人云里雾里的!因此,大家可以等着我们后续分析Producer的发送消息逻辑的时候,我们再一步一图的去分析Producer的完整工作原理。