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拉取到的,接着就会执行下面的核心代码。
Message
Producer在发送RocketMQ消息时,首先检查Topic的路由数据,若未缓存则从NameServer获取。获取路由数据后,选择MessageQueue进行消息发送。MessageQueue作为Topic的物理存储单位,分布在不同Broker上。选择MessageQueue采用简单的负载均衡算法,通过自增索引对MessageQueue列表取模,实现消息的轮询分发。
订阅专栏 解锁全文
733

被折叠的 条评论
为什么被折叠?



