Apache RocketMQ是一款具備低延遲,高性能和可靠性,數十億容量和靈活可擴展性的分佈式消息傳遞和流媒體平臺。它由NameServer、Broker、Producer以及Consumer四部分構成,以下圖所示:shell
全部的集羣都具備水平擴展能力,無單點障礙。apache
NameServer Cluster(名稱服務器集羣)bash
名稱服務器提供輕量級服務發現和路由。每一個NameServer記錄完整的路由信息,提供相應的讀寫服務,並支持快速存儲擴展。服務器
Broker Cluster(代理服務集羣)微信
Broker經過提供輕量級主題和隊列機制來處理消息存儲。它們支持Push和Pull模型,包含容錯機制(2個副本或3個副本),並提供強大的峯值填充和以原始時間順序累積數千億條消息的能力。此外,Broker提供災難恢復,豐富的指標統計數據和警報機制,而傳統的消息傳遞系統都缺少這些機制。併發
Producer Cluster(生產者集羣)負載均衡
生產者支持分佈式部署。分佈式生產者經過多種負載均衡模式向Broker集羣發送消息。發送過程支持快速失敗並具備低延遲。異步
Consumer Cluster(消費者集羣)分佈式
消費者也支持Push和Pull模型中的分佈式部署,它還支持羣集消費和消息廣播。提供了實時的消息訂閱機制,能夠知足大多數消費者的需求。ide
NameServer是一個功能齊全的服務器,主要包含兩個功能:
所以,在啓動代理和客戶端以前,須要提供名稱服務器地址列表告訴他們如何訪問名稱服務器。在Apache RocketMQ中,這能夠經過四種方式詳情完成。
代理服務器負責消息存儲和傳輸,消息查詢,HA保證等。代理服務器有幾個重要的子模塊,以下圖所示:
生產者將業務應用系統生成的消息發送給Broker。 RocketMQ提供了多種發送模式:同步,異步和單向。
相同角色的生產者被組織到一塊兒。在事務提交後,生產組中的不一樣實例均可以鏈接broker執行提交或回滾事務,以防原生產者在提交後就掛掉。
警告:考慮到生產者有很強的消息發送能力,每一個生產者組只容許有一個實例用來避免沒必要要的初始化。
消費者從Broker獲取消息並將其提供給應用程序。從用戶應用的角度來看,提供了兩種類型的消費者:
具備徹底相同角色的消費者被組合在一塊兒並命名爲消費者組,消費羣體是一個很好的概念,它在消息消費方面實現負載平衡和容錯目標是很是容易的。
警告:消費者組的消費者實例必須具備徹底相同的主題訂閱。
主題是生產者提供消息和消費者提取消息的類別。主題與生產者和消費者的關係很是鬆散,具體而言,一個主題可能有零個,一個或多個向其發送消息的生產者;相反,生產者能夠發送不一樣主題的信息;從消費者的角度來看,一個主題可能由零個,一個或多個消費者羣體訂閱。一樣,一個消費羣體能夠訂閱一個或多個主題,只要這個羣體的實例保持其訂閱的一致性便可。
消息是要傳遞的信息。一條消息必須有一個主題,能夠將其解釋爲要發送給您的信件的地址。一條消息也可能有一個可選標籤和額外的鍵值對。例如,您能夠爲消息設置業務密鑰,並在Broker上查找消息以在開發期間診斷問題。
主題被劃分爲一個或多個子主題這就是消息隊列。
標籤能夠理解爲更細一級的主題,爲使用者提供更靈活的查找。使用標記,來自同一業務模塊的具備不一樣目的的消息可能具備相同的主題和不一樣的標記。標籤將有助於保持代碼的清潔和一致性,而且標籤還能夠方便RocketMQ提供的查詢系統。
Broker是RocketMQ系統的主要組成部分。它接收生產者發送的消息,存儲消息並準備處理來自消費者的請求。它還存儲消息相關的元數據,包括消費者組,消耗進度偏移和主題/隊列信息。
名稱服務器做爲路由信息提供者。生產者/消費者客戶端查找主題以找到相應的Broker列表。
當使用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
複製代碼
若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【牛覓技術】,查閱更多精彩歷史!!!: