1. 程式人生 > >[分散式學習]訊息佇列之rocketmq筆記

[分散式學習]訊息佇列之rocketmq筆記

文件地址

RocketMQ架構

嗶哩嗶哩上的視訊

mq有很多,近期買了《分散式訊息中介軟體實踐》這本書,學習關於mq的相關知識。mq大致有有4個功能:

  1. 非同步處理。比如業務端需要給使用者傳送郵件,不需要等傳送完了之後才讓業務端的呼叫程式碼返回。
  2. 服務解耦。服務之間呼叫不需要在程式碼上寫死呼叫某某服務,只需要傳送一個訊息即可。這種傳送訊息的處理一般都是立即返回。類似於生成一個後臺job。
  3. 流量削峰。業務系統在做活動的時候短時間內的流量會特別大,基於mq的佇列的特性,可以處理這個瞬時流量過大的問題,減輕後端壓力。
  4. 訊息通訊。主要是訂閱機制,類似聊天室。

內容介紹

低延時的分散式訊息處理平臺,高效能,可擴充套件,萬億級。由4個部分構成。name server,broker(訊息代理人),producer,consumers。這4個都能水平擴充套件(做成叢集的方式)來避免單點故障。

NameServers (叢集)

NameServer是一個完整的功能性服務。主要包含以下兩個方面:

  • Broker管理。接收Broker叢集過來的註冊訊息,然後提供心跳包機制來檢查Broker是否還存活。
  • 路由管理。每一個NameServer都包含關於Broker的完整路由資訊,並且佇列化處理客戶端的查詢請求。

有4種方式用於客戶端指定NameServer的地址。

  1. 程式設計方式。類似 producer.setNamesrvAddr("ip:port")
  2. Java 配置。使用 rocketmq.namesrv.addr
  3. 環境變數。使用 NAMESRV_ADDR
  4. 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