Producer发送消息的时候,其实会先检查一下要发送消息的Topic的路由数据是否在本地缓存,如果不在的话,就会通过底层的Netty网络通信模块去发送一个请求到NameServer去拉取Topic路由数据,然后缓存在Producer的本地。那么当Producer拿到了一个Topic的路由数据之后,其实接下来就应该选择要发送消息到这个Topic的哪一个MessageQueue上去了!
因为大家都知道,Topic是一个逻辑上的概念,一个Topic的数据往往是分布式存储在多台Broker机器上的,因此Topic本质是由多个MessageQueue组成的。
每个MessageQueue都可以在不同的Broker机器上,当然也可能一个Topic的多个MessageQueue在一个Broker机器上,如下图所示。
只要你知道了要发送消息到哪个MessageQueue上去,然后就知道这个MessageQueue在哪台Broker机器上,接着就跟那台Broker机器建立连接,发送消息给他就可以了。
之前介绍过,发送消息的核心源码是在DefaultMQProducerImpl.sendDefaultImpl()方法中的,在这个方法里,只要你获取到了Topic的路由数据,不管从本地缓存获取的,还是从NameServer拉取到的,接着就会执行下面的核心代码。
MessageQueue mqSelected =