1. 程式人生 > >1.偏頭痛楊的rocketmq4.x入門之基礎概念掃盲篇

1.偏頭痛楊的rocketmq4.x入門之基礎概念掃盲篇

前戲閱讀本文之前,讀者必須自己清楚什麼是訊息佇列,以及訊息佇列的一些基本概念,例如:訊息、生產者、消費者等。我們如果需要玩非同步、分散式事務、程式碼物理解耦、削峰平谷、釋出訂閱等等,可以使用訊息佇列中介軟體,那麼阿里的rocketmq是一款比較中意的產品,既有開源版又有商業版(阿里雲的mq有點貴,誰用誰知道)。商業版與開源版的api不同,有的概念也不同。。。rocketmq的特點是純java編寫、高效能、高吞吐、分散式等等。目前捐贈給阿帕奇,正在被孵化中,有望成為國內的頂級阿帕奇專案之一,希望大家能支援國貨。rocketmq裡的概念比較多,坑也不少,有興趣的童鞋可以研究一下他的原始碼,都是java寫的。
一些大廠面試題也會問到。想要完全掌握這些理論還是需要系統學習的。專案的git站點:rocketmq的歷程:metaq1.x->metaq2.x->alibaba-rocketmq3.x->apache-rocketmq4.x
阿里雲商業版訊息佇列的優缺點:優點:1.省事,傻瓜式運維。2.省心,幾乎不出問題。缺點:1.如果業務量較小,那麼成本比較貴。2.訊息佇列伺服器時間不可控,會導致生產者&消費者伺服器與訊息佇列伺服器的時間不同,造成隱患。 感謝蠢新給予我的幫助與支援,在我最迷茫的時候(被rocketmq的坑卡住的時候)給我方向,非常感謝你。RocketMQ的特點
  • 支援嚴格的訊息順序
  • 億級訊息堆積能力(不考慮記憶體&磁碟等資源)
  • 提供配置、指標和監控等功能豐富Dashboard
  • 消費者同時支援Push與Pull方式消費訊息
  • 歷經多次天貓雙十一海量訊息考驗
  • 訊息失敗重試機制
  • 訊息事務機制
  • producer、consumer、broker、nameserver都可以玩分散式,叢集部署,消除單點故障。
rocketmq的四大金剛(核心組成部分producer、consumer在客戶端,nameserver、broker在服務端。
  • producer
訊息的生產者,負責傳送訊息,將訊息推送給broker。一般由業務系統負責產生訊息。訊息有3種傳送方式:同步、非同步、單向。 
  • broker
rocketmq的核心元件,負責訊息的接收、儲存(持久化到磁碟)、被消費者拉取訊息等功能。
broker也儲存訊息相關的元資料,包括:消費者組、消費進度、topic&queue資訊等。broker是個邏輯概念,1個broker = 1個master + 0至n個slave,具有同1個broker name的master和slave進行配對。
  • consumer
訊息的消費者,從broker上拉取訊息從而進行消費。rocketmq提供兩種消費者。一般是後臺系統負責非同步消費訊息。主動消費者:DefaultMQPullConsumer,從broker中拉取一批訊息並消費,主動權由消費者控制。被動消費者:DefaultMQPushConsumer,消費者實現回撥介面,一旦有訊息,broker回撥介面,消費者被動響應。(被動消費者給使用者感覺是訊息從broker推到了應用客戶端,但是實際PushConsumer內部是使用長輪詢Pull方式從broker拉訊息,然後再回呼叫戶Listener方法。)
  • name server
註冊中心的作用,提供輕量級的服務發現和提供路由資訊(broker的服務註冊與發現)。nameserver存有全量的路由資訊,提供對等的讀寫服務,支援快速擴縮容。nameserver接收broker的請求,註冊broker的路由資訊。nameserver接收client(producer/consumer)的請求,根據訊息的topic獲取相應的broker路由資訊。手動建立的topic可以指定broker,自動建立的topic會隨機指定broker,也許指定單個或全部,topic的概念在後面。叢集部署後,節點之間無任何資訊同步。(在1.x與2.x時代是使用zookeeper,3.x時代自主研發了nameserver,更加輕量級,效能更好)其他核心概念
  • topic(主題)
一種訊息的邏輯分類(訊息的型別),比如說你有訂單類的訊息,也有庫存類的訊息,那麼就需要進行分類儲存。生產者方面:發訊息時需指定topic,可以有1-n個生產者釋出1個topic的訊息,也1個生產者可以釋出不同topic的訊息。消費者方面:收訊息時需訂閱topic,可以有1-n個消費者組訂閱1個topic的訊息,1個消費者組可以訂閱不同topic的訊息。1個訊息必須指定1個topic,topic允許自動建立與手工建立,topic建立時需要指定broker,可以指定1個或多個,name server就是通過broker與topic的對映關係來做路由。producer和consumer在生產和消費訊息時,都需要指定訊息的 topic,當topic匹配時,consumer 才會消費到producer傳送的訊息。topic與broker是多對多的關係,一個topic分佈在多個broker上,一個broker可以配置多個topic。
  • message(訊息)
message是訊息的載體。每個message必須指定一個topic,相當於寄信的地址。message還有一個可選的tag設定,以便消費端可以基於tag進行過濾訊息。message還有擴充套件的kv結構,例如你可以設定一個業務key到你的訊息中,在broker上查詢訊息並診斷問題。注意:msgId與msgKey。
  • tag(標籤)
標籤可以被認為是對topic的進一步細化。一般在相同業務模組中通過引入標籤來標記不同用途的訊息。區分相同topic下不同種類的訊息。生產到哪個topic的哪個tag下,消費者也是從topic的哪個tag進行消費,即實現訊息的過濾。
  • queue(佇列)
queue是訊息的物理管理單位,而topic是邏輯管理單位。一個topic下可以有多個queue,預設自動建立是4個,手動建立是8個。queue的引入使得訊息儲存可以分散式叢集化,具有了水平擴充套件的能力。1個message只能屬於1個queue、1個topic。在rocketmq中,所有訊息佇列都是持久化,長度無限的資料結構,所謂長度無限是指佇列中的每個儲存單元都是定長,訪問其中的儲存單元使用offset來訪問,offset 為 java long 型別,64 位,理論上在 100年內不會溢位,所以認為是長度無限,另外佇列中只儲存最近幾天的資料,之前的資料會按照過期時間來刪除。也可以認為 Message Queue是一個長度無限的陣列,offset就是下標。rocketmq中,producer將訊息傳送給broker時,需要指定傳送到哪一個queue中,預設情況下,producer會輪詢的將訊息傳送到每個queue中,順序是隨機的,但總體上每個queue的訊息數量均分,所有broker下的queue合併成一個list去輪詢,也可以由程式設計師通過MessageQueueSelector介面來指定具體傳送到哪個queue中。對於consumer而言,會為每個consumer分配固定的佇列(如果佇列總數沒有發生變化),consumer從固定的佇列中去拉取沒有消費的訊息進行處理。消費端會通過RebalanceService執行緒,10秒鐘做一次基於topic下的所有佇列負載,獲取同一個Consumer Group下的所有Consumer例項數或Topic的queue的個數是否改變,通知所有Consumer例項重新做一次負載均衡演算法。
  • offset(消費進度)
理解成消費進度,可自增。
  • commit log(儲存檔案)
雖然每個topic下面有很多message queue,但是message queue本身並不儲存訊息。真正的訊息儲存會寫在CommitLog的檔案,message queue只是儲存CommitLog中對應的位置資訊,方便通過message queue找到對應儲存在CommitLog的訊息。 不同的topic,message queue都是寫到相同的CommitLog 檔案,也就是說CommitLog完全的順序寫。四大金剛的呼叫關係
服務啟動順序:name server->broker->producer&consumer每個broker與name server叢集中的所有節點建立長連線,定時註冊topic&broker的路由資訊到所有name server中。producer與name server叢集中的其中一個節點(隨機選擇)建立長連線,定期從name server獲取topic路由資訊,並向提供topic服務的broker master建立長連線,且定期向broker master傳送心跳,produce無狀態,可叢集部署。producer只能將訊息傳送到broker master,但是consumer則不一樣。consumer與name server叢集中的其中一個節點(隨機選擇)建立長連線,定期從name server獲取topic路由資訊,consumer同時與提供topic服務的master和slave建立長連線且定時傳送心跳,consumer既可以從broker master訂閱訊息,也可以從broker slave訂閱訊息,訂閱規則由broker配置決定。broker一旦需要橫向擴充套件,只需要啟動更多的broker即可,然後把對應的topic建上,客戶端的queue集合即會變大,並且由於每個group下面的topic的配置都是獨立的,也就說可以讓broker1下面的那個topic的queue數量是4,其他broker下的topic queue數量是2,這樣broker1則得到更大的負載。

rocketmq的組
相同組的例項組成了一個叢集,具有天然的訊息負載均衡及高效的水平擴充套件機制。例如:生產者生產了9條訊息,消費者組有3個消費者例項,那麼每個例項將均攤3條訊息!
  • ConsumerGroup(訂閱組)
具有同樣邏輯消費同樣訊息的consumer,可以歸併為一個group。同一個group內的消費者,可以共同消費(叢集消費模式)對應topic的訊息,達到分散式並行處理(負載均衡)的功能。在叢集模式下,同一條訊息只會被同一個 consumer group 中的一個消費者消費,不同 consumer group 的 consumer 可以消費同一條訊息;而廣播模式則是多個 consumer 都會消費到同一條訊息。broker建立ConsumerGroup,ConsumerGroup內的Consumer例項控制Topic的訂閱,ConsumerGroup內的Consumer例項可以訂閱多個Topic。
  • ProducerGroup(生產組)
通常具有同樣作用(同樣topic)的一些producer可以歸為同一個group。在事務訊息機制中,如果傳送某條事務訊息後的producer-A宕機,使得事務訊息一直處於PREPARED狀態並超時,則broker會回查同一個group的其他producer,確認這條訊息應該commit還是rollback。
訊息佇列產品對比rocketmq>kafka>activemq,整體上rocketmq還是佔優勢的。
總結主要掌握rocketmq的四大金剛以及互相的關係,此外一些核心概念例如:topic、queue、message也是重點,需要理解而不是死記硬背。