一、架構簡述
RocketMQ阿里開源的一個分散式訊息傳遞和流媒體平臺,具有低延遲,高效能和可靠性, 萬億級容量和靈活的可伸縮性。跟其它中介軟體相比,RocketMQ的特點是純JAVA實現,在發生當機和其它故障時訊息丟失率更低。
它由四個部分組成:nameserver,broker,生產者和消費者。它們中的每一個都可以水平擴充套件,而沒有單個故障點。
Nameserver:提供輕量級的服務發現和路由。生產者和消費者通過nameserver獲取broker資訊。它幾乎是無狀態的,nameserver結點之間沒有任何的資料同步,broker註冊資訊時會註冊到每一個nameserver結點上面,所以每個nameserver節點都記錄了完整broker資訊,提供相應的讀寫服務,並支援快速的儲存擴充套件。
Broker:通過提供輕量級的topic和queue機制來儲存訊息。與nameserver中的每個節點建立長連線,定時註冊topic等資訊到nameserver上面。broker一般都是主從模式,因為訊息是真實儲存訊息的地方,避免一個結點掛了,導致這個節點資料全部丟失。
Producer:與nameserver叢集中的一個結點建立長連線,定期的拉取broker 的topic路由資訊,再將訊息傳送到對應broker的topic上面
Consumer:與nameserver叢集中的一個結點建立長連線,定期的拉取broker 的topic路由資訊,再去消費對應broker的topic資訊
二、環境搭建
1.官網下載:http://rocketmq.apache.org/release_notes/release-notes-4.7.0/
2.解壓 unzip rocketmq-all-4.7.0-bin-release.zip
3.修改啟動引數配置。預設的jvm引數記憶體設定特別大,如果自己機器不行的話需要手動改下bin目錄下的啟動引數檔案:runbroker.sh 和runserver.sh檔案 我的虛擬機器記憶體分配不大,改成256m 256m 128m
這是預設的
4.啟動nameserver: nohup sh mqnamesrv ‐n 192.168.0.67:9876 & (將日誌輸出當前目錄的nohub.out檔案,方便檢視啟動日誌,ip是當前機器的ip)
5.啟動broker:nohup sh mqbroker ‐n 192.168.0.67:9876 autoCreateTopicEnable=true & (autoCreateTopicEnable=true 自動建立topic,如果不設定true的話,生產者傳送訊息的時候如果沒有topic就會傳送失敗,需要提前把topic建立好,設定true會在傳送時自動建立topic,192.168.0.67:9876 是name server)
也可以使用配置檔案啟動broker:nohup sh mqbroker ‐n 192.168.0.67:9876 ‐c conf/broker.conf &
簡單看下預設的配置檔案中的一些引數:
#叢集名字
brokerClusterName = DefaultCluster
#broker名字,叢集中主從都要用這個名字,才會組成一個叢集
brokerName = broker-a
#id為0的是master 非0的slava
brokerId = 0
#訊息處理時間,凌晨4點
deleteWhen = 04
#訊息儲存時間預設48小時,48小時之後的凌晨4點就會清理
fileReservedTime = 48
#叢集主從之間資料同步方式
#非同步只需要發到master成功就返回客戶端段成功,效能高,但是如果master掛了 slave還未同步就會丟失訊息。根據自身業務場景選擇合適方式
brokerRole = ASYNC_MASTER
#訊息刷盤機制,和主從資料同步類似,同步就是說需要寫進磁碟了才返回成功。非同步就是寫進記憶體了就返回成功,後面再去落盤。
flushDiskType = ASYNC_FLUSH
#自動建立topic
autoCreateTopicEnable=true
使用配置檔案啟動:nohup sh bin/mqbroker ‐n 192.168.0.67:9876 -c conf/broker.conf &
broker 192.168.0.67:10911關聯的nameserver是192.168.0.67:9876
至此一個單機的rocketMQ的環境就搭建好了 正常退出: sh mqshutdown broker 和 sh mqshutdown namesrv
測試下訊息傳送,使用rocketMQ提供的測試指令碼:
export NAMESRV_ADDR=192.168.0.67:9876
生產者指令碼
消費訊息: