[分散式學習]訊息佇列之rocketmq筆記
文件地址
RocketMQ架構
嗶哩嗶哩上的視訊
mq有很多,近期買了《分散式訊息中介軟體實踐》這本書,學習關於mq的相關知識。mq大致有有4個功能:
- 非同步處理。比如業務端需要給使用者傳送郵件,不需要等傳送完了之後才讓業務端的呼叫程式碼返回。
- 服務解耦。服務之間呼叫不需要在程式碼上寫死呼叫某某服務,只需要傳送一個訊息即可。這種傳送訊息的處理一般都是立即返回。類似於生成一個後臺job。
- 流量削峰。業務系統在做活動的時候短時間內的流量會特別大,基於mq的佇列的特性,可以處理這個瞬時流量過大的問題,減輕後端壓力。
- 訊息通訊。主要是訂閱機制,類似聊天室。
內容介紹
低延時的分散式訊息處理平臺,高效能,可擴充套件,萬億級。由4個部分構成。name server,broker(訊息代理人),producer,consumers。這4個都能水平擴充套件(做成叢集的方式)來避免單點故障。
NameServers (叢集)
NameServer是一個完整的功能性服務。主要包含以下兩個方面:
- Broker管理。接收Broker叢集過來的註冊訊息,然後提供心跳包機制來檢查Broker是否還存活。
- 路由管理。每一個NameServer都包含關於Broker的完整路由資訊,並且佇列化處理客戶端的查詢請求。
有4種方式用於客戶端指定NameServer的地址。
- 程式設計方式。類似
producer.setNamesrvAddr("ip:port")
- Java 配置。使用
rocketmq.namesrv.addr
- 環境變數。使用
NAMESRV_ADDR
- http 端點。
提供輕量的服務發現與路由,每一個Name Server記錄完整的路由資訊,提供相應的讀寫服務,同時支援快速儲存擴充套件。
Broker (叢集)
Broker負責訊息的儲存和分發,訊息查詢,高可用保證等。模組如下圖所示。
所以,他有以下幾個比較重要的子模組:
- 遠端模組。Broker的入口,用於接收客戶端過來的請求。
- 客戶端管理。用於(生產者/消費者)模式的客戶端管理,維護消費者對主題的訂閱。
- 儲存服務。提供一些簡單的api用於查詢or儲存物理磁碟上的訊息。
- 高可用保證服務。提供主從Broker之間的資料同步特性。
- 索引服務。通過特定的key對訊息構建索引,然後提供訊息查詢。
通過提供輕量級的主題佇列機制來負責訊息的儲存。支援推拉模式,包含錯誤容忍機制(2或3份拷貝)。訊息的順序處理。提供容災回覆,預警機制等。
Producer (叢集)
生產者提供分散式部署。分散式的生產者通過負載均衡的方式傳送訊息給Broker。支援快速錯誤反饋,並且低延遲。
Consumer (叢集)
消費者也支援在推/拉模式中的分散式部署。支援叢集消費+訊息廣播。提供實時的訊息訂閱機制以滿足大部分需求。
如何執行(單機測試環境)
下載
安裝包就好(原始碼也行),然後解壓
wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip
unzip rocketmq-all-4.5.1-bin-release.zip -d /usr/lib/rocketmq/
改一些配置
環境變數
#配置64位jdk是必須的---這裡跳過
export ROCKETMQ_HOME=/usr/lib/rocketmq/rocketmq #這個不是必須,只是方便下面操作
source ~/.bash_profile #使配置生效一下
rm -f ~/logs/rocketmqlogs/*.log # 把日誌清了,方便檢視
啟動引數
rocketmq預設的記憶體配置要求對我們的測試伺服器要求太高了,改低一點。
vim $ROCKETMQ_HOME/bin/runserver.sh
# 把第39行改成
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g" #最小,啟動,最大都是1g
vim $ROCKETMQ_HOME/bin/runbroker.sh
# 把39行改成
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g" # 同上面
broker配置
vim $ROCKETMQ_HOME/conf/broker.conf
# 加這些配置
brokerIP1 = 192.168.3.20 #此broker的ip
namesvrAddr=192.168.3.20:9876 #nameServer地址,叢集的話需要分號分隔。
啟動NameServer
因為需要NameServer來管理Broker,所以先啟動NameServer。預設的日誌地址為~/logs/rocketmqlogs
。
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv & # 以忽略掛起訊號的方式啟動nameserver
tail -f ~/logs/rocketmqlogs/namesrv.log # 監控的方式檢視日誌尾部
啟動Broker
訊息要通過Broker來分發,NameServer也已經啟動,所以現在可以啟動Broker。
nohup sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/broker.conf &
tail -f ~/logs/rocketmqlogs/broker.log
web站點檢視
這裡需要去下載這個,裡面有個rocketmq-console。需要修改一個地方。rocketmq-externals/rocketmq-console/src/main/resources/application.properties
,
rocketmq.config.namesrvAddr=192.168.3.20:9876 #改成對應的namesrvAddr 地址
伺服器上需要開放幾個埠用於console的連線,如果沒有配置,就是預設的:9876,10911,10909
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
然後就能查看了。
傳送、接收訊息
後續通過程式碼客戶端的方式來實踐。
關閉服務
sh $ROCKETMQ_HOME/bin/mqshutdown broker #先關了Broker
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv #再關閉nameserver