RocketMQ概述
Apache RocketMQ是一款具有低延遲,高效能和可靠性,數十億容量和靈活可擴充套件性的分散式訊息傳遞和流媒體平臺。它由NameServer、Broker、Producer以及Consumer四部分構成,如下圖所示:
所有的叢集都具有水平擴充套件能力,無單點障礙。
-
NameServer Cluster(名稱伺服器叢集)
名稱伺服器提供輕量級服務發現和路由。每個NameServer記錄完整的路由資訊,提供相應的讀寫服務,並支援快速儲存擴充套件。
-
Broker Cluster(代理服務叢集)
Broker通過提供輕量級主題和佇列機制來處理訊息儲存。它們支援Push和Pull模型,包含容錯機制(2個副本或3個副本),並提供強大的峰值填充和以原始時間順序累積數千億條訊息的能力。此外,Broker提供災難恢復,豐富的指標統計資料和警報機制,而傳統的訊息傳遞系統都缺乏這些機制。
-
Producer Cluster(生產者叢集)
生產者支援分散式部署。分散式生產者通過多種負載均衡模式向Broker叢集傳送訊息。傳送過程支援快速失敗並具有低延遲。
-
Consumer Cluster(消費者叢集)
消費者也支援Push和Pull模型中的分散式部署,它還支援群集消費和訊息廣播。提供了實時的訊息訂閱機制,可以滿足大多數消費者的需求。
NameServer
NameServer是一個功能齊全的伺服器,主要包含兩個功能:
- 代理管理,NameServer接受來自代理群集的註冊,並提供心跳機制來檢查代理是否存活。
- 路由管理,每個NameServer將儲存有關代理群集的全部路由資訊以及用於客戶端查詢的佇列資訊。
因此,在啟動代理和客戶端之前,需要提供名稱伺服器地址列表告訴他們如何訪問名稱伺服器。在Apache RocketMQ中,這可以通過四種方式詳情完成。
Broker Server
代理伺服器負責訊息儲存和傳輸,訊息查詢,HA保證等。代理伺服器有幾個重要的子模組,如下圖所示:
- Remoting Module, the entry of broker, handles the requests from clients.
- Client Manager, manages the clients (Producer/Consumer) and maintains topic subscription of consumer.
- Store Service, provides simple APIs to store or query message in physical disk.
- HA Service, provides data sync feature between master broker and slave broker.
- Index Service, builds index for messages by specified key and provides quick message query.
核心概念
Producer
生產者將業務應用系統生成的訊息傳送給Broker。 RocketMQ提供了多種傳送模式:同步,非同步和單向。
Producer Group
相同角色的生產者被組織到一起。在事務提交後,生產組中的不同例項都可以連線broker執行提交或回滾事務,以防原生產者在提交後就掛掉。
警告:考慮到生產者有很強的訊息傳送能力,每個生產者組只允許有一個例項用來避免不必要的初始化。
Consumer
消費者從Broker獲取訊息並將其提供給應用程式。從使用者應用的角度來看,提供了兩種型別的消費者:
- PullConsumer:PullConsumer積極從Broker拉取訊息。一旦批量訊息被拉出,使用者應用程式啟動消費過程。
- PushConsumer:另一方面,PushConsumer封裝訊息拉取,消耗進度和維持其他內部工作,留下一個回撥介面給終端使用者執行訊息到達時執行的訊息。
Consumer Group
具有完全相同角色的消費者被組合在一起並命名為消費者組,消費群體是一個很好的概念,它在訊息消費方面實現負載平衡和容錯目標是非常容易的。
警告:消費者組的消費者例項必須具有完全相同的主題訂閱。
Topic
主題是生產者提供訊息和消費者提取訊息的類別。主題與生產者和消費者的關係非常鬆散,具體而言,一個主題可能有零個,一個或多個向其傳送訊息的生產者;相反,生產者可以傳送不同主題的資訊;從消費者的角度來看,一個主題可能由零個,一個或多個消費者群體訂閱。同樣,一個消費群體可以訂閱一個或多個主題,只要這個群體的例項保持其訂閱的一致性即可。
Message
訊息是要傳遞的資訊。一條訊息必須有一個主題,可以將其解釋為要傳送給您的信件的地址。一條訊息也可能有一個可選標籤和額外的鍵值對。例如,您可以為訊息設定業務金鑰,並在Broker上查詢訊息以在開發期間診斷問題。
Message Queue
主題被劃分為一個或多個子主題這就是訊息佇列。
Tag
標籤可以理解為更細一級的主題,為使用者提供更靈活的查詢。使用標記,來自同一業務模組的具有不同目的的訊息可能具有相同的主題和不同的標記。標籤將有助於保持程式碼的清潔和一致性,並且標籤還可以方便RocketMQ提供的查詢系統。
Broker
Broker是RocketMQ系統的主要組成部分。它接收生產者傳送的訊息,儲存訊息並準備處理來自消費者的請求。它還儲存訊息相關的後設資料,包括消費者組,消耗進度偏移和主題/佇列資訊。
Name Server
名稱伺服器作為路由資訊提供者。生產者/消費者客戶端查詢主題以找到相應的Broker列表。
Message Model
- Clustering
- Broadcasting
Message Order
當使用DefaultMQPushConsumer時,你可能需要決定消費是順序的還是併發的。
-
Orderly(順序)
有序的訊息意味著訊息的使用順序與生產者為每個訊息佇列傳送的順序相同。如果你的使用場景要求必是須順序的,你要確保只用一個佇列存放訊息。
警告:如果消費順序被指定,最大的消費併發數就是這個消費者組的訊息佇列的訂閱數。
-
Concurrently(併發)
併發使用訊息時,消費訊息的最大併發性僅受限於為每個消費者客戶端指定的執行緒池。
快速開始
-
Download & Build from Release
> unzip rocketmq-all-4.2.0-source-release.zip > cd rocketmq-all-4.2.0/ > mvn -Prelease-all -DskipTests clean install -U > cd distribution/target/apache-rocketmq 複製程式碼
-
Start Name Server
> nohup sh bin/mqnamesrv & > tail -f ~/logs/rocketmqlogs/namesrv.log The Name Server boot success... 複製程式碼
-
Start Broker
> nohup sh bin/mqbroker -n localhost:9876 & > tail -f ~/logs/rocketmqlogs/broker.log The broker[%s, 172.30.30.233:10911] boot success... 複製程式碼
-
Send & Receive Messages
> export NAMESRV_ADDR=localhost:9876 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer SendResult [sendStatus=SEND_OK, msgId= ... > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer ConsumeMessageThread_%d Receive New Messages: [MessageExt... 複製程式碼
-
Shutdown Servers
> sh bin/mqshutdown broker The mqbroker(36695) is running... Send shutdown request to mqbroker(36695) OK > sh bin/mqshutdown namesrv The mqnamesrv(36664) is running... Send shutdown request to mqnamesrv(36664) OK 複製程式碼
如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【牛覓技術】,查閱更多精彩歷史!!!: