RocketMQ實戰(二)

在上一篇《RocketMQ實戰(一)》中已經為大家初步介紹了下RocketMQ以及搭建了雙Master環境,接下來繼續為大家介紹!

Quick Start

寫一個簡單的生產者、消費者,帶大家快速體驗RocketMQ~

Maven配置:

pom.xml

生產者:

生產者代碼

消費者:

消費者代碼

無論生產者、消費者都必須給出GroupName,而且具有唯一性!

生產到哪個Topic的哪個Tag下,消費者也是從Topic的哪個Tag進行消費,可見這個Tag有點類似于JMS Selector機制,即實現消息的過濾。

生產者、消費者需要設置NameServer地址。

這里,采用的是Consumer Push的方式,即設置Listener機制回調,相當于開啟了一個線程。以后為大家介紹Consumer Pull的方式。

我們看一下運行結果:

生產者運行結果

仔細看看生產者結果輸出,你會發現,有的消息發往broker-a,有的在broker-b上,自動實現了消息的負載均衡!


消費者運行結果

這里消費消息是沒有什么順序的,以后我們在來談消息的順序性。

我們再來看一看管控臺:

消息分布在2個broker上


消費后

在多Master模式中,如果某個Master進程掛了,顯然這臺broker將不可用,上面的消息也將無法消費,要知道開源版本的RocketMQ是沒有提供切換程序,來自動恢復故障的,因此在實際開發中,我們一般提供一個監聽程序,用于監控Master的狀態。

在ActiveMQ中,生產消息的時候會提供是否持久化的選擇,但是對于RocketMQ而言,消息是一定會被持久化的!

上面的消費者采用的是Push Consumer的方式,那么監聽的Listener中的消息List到底是多少條呢?雖然提供了API,如consumer.setConsumeMessageBatchMaxSize(10),實際上即使設置了批量的條數,但是注意了,是最大是10,并不意味著每次batch的都是10,只有在消息有擠壓的情況下才有可能。而且Push Consumer的最佳實踐方式就是一條條的消費,如果需要batch,可以使用Pull Consumer。

務必保證先啟動消費者進行Topic訂閱,然后在啟動生產者進行生產(否則極有可能導致消息的重復消費,重復消費,重復消費!重要的事情說三遍!關于消息的重復問題后續給大家介紹~)。而且在實際開發中,有時候不會批量的處理消息,而是原子性的,單線程的去一條一條的處理消息,這樣就是實時的在處理消息。(批量的處理海量的消息,可以考慮Kafka)


初步了解消息失敗重試機制

消息失敗,無非涉及到2端:從生產者端發往MQ的失??;消費者端從MQ消費消息的失?。?/b>

生產者端的失敗重試

生產者端失敗重試

生產者端的消息失?。罕热缇W絡抖動導致生產者發送消息到MQ失敗。

上圖代碼示例的處理手段是:如果該條消息在1S內沒有發送成功,那么重試3次。

消費者端的失敗重試

消費者端的失敗,分為2種情況,一個是timeout,一個是exception

timeout,比如由于網絡原因導致消息壓根就沒有從MQ到消費者上,在RocketMQ內部會不斷的嘗試發送這條消息,直至發送成功為止?。ū热缂褐幸粋€broker失敗,就嘗試另一個broker)

exception,消息正常的到了消費者,結果消費者發生異常,處理失敗了。這里涉及到一些問題,需要我們思考下,比如,消費者消費消息的狀態有哪些定義?如果失敗,MQ將采取什么策略進行重試?假設一次性批量PUSH了10條,其中某條數據消費異常,那么消息重試是10條呢,還是1條呢?而且在重試的過程中,需要保證不重復消費嗎?


ConsumeConcurrentlyStatus

消息消費的狀態,有2種,一個是成功(CONSUME_SUCCESS),一個是失敗&稍后重試(RECONSUME_LATER)


broker啟動日志

在啟動broker的過程中,可以觀察下日志,你會發現RECONSUME_LATER的策略。

如果消費失敗,那么1S后再次消費,如果失敗,那么5S后,再次消費,......直至2H后如果消費還失敗,那么該條消息就會終止發送給消費者了!

RocketMQ為我們提供了這么多次數的失敗重試,但是在實際中也許我們并不需要這么多重試,比如重試3次,還沒有成功,我們希望把這條消息存儲起來并采用另一種方式處理,而且希望RocketMQ不要在重試呢,因為重試解決不了問題了!這該如何做呢?

我們先來看一下一條消息MessageExt對象的輸出:

MessageExt [queueId=0, storeSize=137, queueOffset=0, sysFlag=0, bornTimestamp=1492213846916, bornHost=/192.168.99.219:50478, storeTimestamp=1492213846981, storeHost=/192.168.99.121:10911, msgId=C0A8637900002A9F0000000000000000, commitLogOffset=0, bodyCRC=613185359, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=TopicTest2, flag=0, properties={TAGS=TagA, WAIT=true, MAX_OFFSET=3, MIN_OFFSET=0}, body=16]]

注意到reconsumeTimes屬性,這個屬性就代表消息重試的次數!來看一段代碼:

reconsumeTime的使用

注意了,對于消費消息而言,存在2種指定的狀態(成功 OR 失敗重試),如果一條消息在消費端處理沒有返回這2個狀態,那么相當于這條消息沒有達到消費者,勢必會再次發送給消費者!也即是消息的處理必須有返回值,否則就進行重發。


天然的消息負載均衡及高效的水平擴展機制


消息的負載均衡

對于RocketMQ而言,通過ConsumeGroup的機制,實現了天然的消息負載均衡!通俗點來說,RocketMQ中的消息通過ConsumeGroup實現了將消息分發到C1/C2/C3/......的機制,這意味著我們將非常方便的通過加機器來實現水平擴展!

我們考慮一下這種情況:比如C2發生了重啟,一條消息發往C3進行消費,但是這條消息的處理需要0.1S,而此時C2剛好完成重啟,那么C2是否可能會收到這條消息呢?答案是肯定的,也就是consume broker的重啟,或者水平擴容,或者不遵守先訂閱后生產消息,都可能導致消息的重復消費!關于去重的話題會在后續中予以介紹!

至于消息分發到C1/C2/C3,其實也是可以設置策略的。


消息負載策略


集群消費 AND 廣播消費

RocketMQ的消費方式有2種,在默認情況下,就是集群消費,也就是上面提及的消息的負載均衡消費。另一種消費模式,是廣播消費。廣播消費,類似于ActiveMQ中的發布訂閱模式,消息會發給Consume Group中的每一個消費者進行消費。


消費模式


設置消費模式


OK,到這里,本期的RocketMQ就結束了,咱們下期見~

周末愉快!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容

  • 分布式開放消息系統(RocketMQ)的原理與實踐 來源:http://www.lxweimin.com/p/453...
    meng_philip123閱讀 12,995評論 6 104
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,789評論 18 139
  • 背景介紹 Kafka簡介 Kafka是一種分布式的,基于發布/訂閱的消息系統。主要設計目標如下: 以時間復雜度為O...
    高廣超閱讀 12,863評論 8 167
  • 消息中間件需要解決哪些問題? Publish/Subscribe 發布訂閱是消息中間件的最基本功能,也是相對于傳統...
    壹點零閱讀 1,626評論 0 7
  • 我發現咨詢是一件和生活很相似的事情,當來訪者不想透露太多時你不要去挖掘,當你挖掘的越多你和來訪者可能都會受到傷害,...
    coolsharer閱讀 237評論 0 0