掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(消息堆積)、消費 三大塊領域。

那接下來,我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過程。
注意,如果白話中不小心提到相關代碼配置與類名,請參考RocketMQ 4.9.4版本
RocketMQ生產(chǎn)消息時,支持多種「消息類型」:
SendResult send(final Message msg);SendResult send(final Message msg, final MessageQueueSelector selector, final Object arg);SendResult send(final Message msg, final MessageQueue mq);上面列舉的三種send方法,都是以同步發(fā)送模式為例。定時/延遲消息從發(fā)送方式角度來說,不算一種獨立的消息類型。
一般我們要發(fā)送一條消息給RocketMQ,需要創(chuàng)建這樣一個消息體。
Message msg = new Message( "TestTopic", "Hello World".getBytes() );在這個消息體里面,我們只單純指定了要發(fā)送的Topic名字,以及要發(fā)送的消息內容。
那么,RocketMQ-client怎么知道這條消息要發(fā)送到RocketMQ集群中的哪一個broker上呢?
這里需要了解下RocketMQ中Topic的「路由注冊與發(fā)現(xiàn)機制」。
RocketMQ基本架構
Topic 路由注冊與發(fā)現(xiàn):
Topic路由信息
Topic的路由信息,包括了Topic的 隊列queue和broker的映射關系 ,那么如何利用這個Topic的路由信息呢?
我們需要根據(jù)前面的不同「消息類型」進行分別討論:
根據(jù)消息類型獲取到目標隊列queue后,就可以根據(jù)Topic路由信息發(fā)送消息到指定broker上了。
從發(fā)送模式角度來說,RocketMQ有三種「消息發(fā)送模式」:
SendResult send(final Message msg);void send(final Message msg, final SendCallback sendCallback);void sendOneway(final Message msg);上面列舉的三種send方法,都是以「普通消息」為例。
「消息類型」 和 「消息發(fā)送模式」 是 N*M 的關系,所以聰明的你一定已經(jīng)想到了,存在9種不同組合(不包括事物消息),RocketMQ也是在接口中定義了9種不同方法。
前面介紹了三種「消息發(fā)送模式」,其中「單向發(fā)送」屬于不可靠發(fā)送,我們無法知道是否發(fā)送成功。
而「同步發(fā)送」和「異步發(fā)送」都是可靠發(fā)送,我們能夠獲取發(fā)送狀態(tài),知道是否成功。
在「同步發(fā)送」中,我們可以根據(jù)SendResult中的sendStatus屬性判斷是否發(fā)送成功。
SendResult類屬性
在「異步發(fā)送」中,我們可以自定義實現(xiàn)SendCallback的onSuccess()方法和onException()方法,來判斷消息是否發(fā)送成功。
SendCallback接口定義
如果消息發(fā)送失敗了,RocketMQ-client默認有重試機制,以確保消息的高可用性。
前面提到,生產(chǎn)者每30秒獲取一次主題的路由信息,所以即使某個 Broker 宕機,消息發(fā)送者可能無法立即察覺到它的宕機狀態(tài)。
但是,當消息發(fā)送者向某個 Broker 發(fā)送消息后,如果返回異常,生產(chǎn)者會在接下來的一段時間內(例如5分鐘)避免再次選擇該 Broker 上的隊列來發(fā)送消息。這樣做的目的是規(guī)避可能發(fā)生故障的 Broker。
當然了,用戶也能根據(jù)返回的異常,自己定義業(yè)務重試、補償機制。
需要注意的是,不同「消息類型」和「消息發(fā)送模式」的RocketMQ-client默認重試機制不同。
消息類型:
注意:有序消息異常時RocketMQ-client都是默認不重試
消息發(fā)送模式:
注意:單向發(fā)送模式異常時RocketMQ-client默認不重試

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流