天天看點

RocketMQ(二)——TopicPublicInfo

Producer發送消息是如何得知發到哪個broker的 ? 

每個應用在收發消息之前,一般會調用一次producer.start()/consumer.start(),幕後的工作就是:建立需要的執行個體對象,如MQClientInstance;設定定時任務,如從Nameserver中定時更新本地的Topic route info,發送心跳資訊到所有的broker,動态調整線程池的大小,等等;把目前producer加入到指定的組中。用戶端會緩存路由資訊TopicPublishInfo, 同時定期從NameServer取Topic路由資訊,每個Broker與NameServer叢集中的所有節點建立長連接配接,定時注冊Topic資訊到所有的NameServer。Producer在發送消息的時候會去查詢本地的topicPublishInfoTable(一個HashMap),如果沒有命中的話就會與NameServer溝通得到路由資訊,RequestCode=GET_ROUTEINTO_BY_TOPIC 如果nameserver中也木有查詢到,那麼将會發送一個default的topic進行路由查詢。,如圖所示:

RocketMQ(二)——TopicPublicInfo

Producer發送消息的具體過程,以同步模式為例。 

得到了通信位址,發送過程就顯而易見了。可以看到在選擇消息隊列進行發送時采用随機方式,同時和上一次發送的broker保持不同,防止熱點

RocketMQ(二)——TopicPublicInfo