阿里巴巴有2大核心的分散式技術,一個是OceanBase,另一個就是RocketMQ。在實際專案中已經領教過RocketMQ的強大,RocketMQ實戰系列,將涵蓋RocketMQ的簡介,環境搭建,初步使用、API詳解、架構分析、管理員叢集操作等知識。
What is RocketMQ?
RocketMQ作為一款分散式的訊息中介軟體(阿里的說法是不遵循任何規範的,所以不能完全用JMS的那一套東西來看它),經歷了Metaq1.x、Metaq2.x的發展和淘寶雙十一的洗禮,在功能和效能上遠超ActiveMQ。
要知道RocketMQ原生就是支援分散式的,而ActiveMQ原生存在單點性。
RocketMQ可以保證嚴格的訊息順序,而ActiveMQ無法保證!
RocketMQ提供億級訊息的堆積能力,這不是重點,重點是堆積了億級的訊息後,依然保持寫入低延遲!
豐富的訊息拉取模式(Push or Pull)
Push好理解,比如在消費者端設定Listener回撥;而Pull,控制權在於應用,即應用需要主動的呼叫拉訊息方法從Broker獲取訊息,這裡面存在一個消費位置記錄的問題(如果不記錄,會導致訊息重複消費)。在Metaq1.x/2.x的版本中,分散式協調採用的是Zookeeper,而RocketMQ自己實現了一個NameServer,更加輕量級,效能更好!
訊息失敗重試機制、高效的訂閱者水平擴充套件能力、強大的API、事務機制等等(後續詳細介紹)
初步理解Producer/Consumer Group
ActiveMQ中並沒有Group這個概念,而在RocketMQ中理解Group的機制很重要。
Group機制
想過沒有,通過Group機制,讓RocketMQ天然的支援訊息負載均衡!
比如某個Topic有9條訊息,其中一個Consumer Group有3個例項(3個程式 OR 3臺機器),那麼每個例項將均攤3條訊息!(注意RocketMQ只有一種模式,即釋出訂閱模式。)
install RocketMQ
RocketMQ的Broker叢集部署模式還挺多的,比如單Master模式、多Master模式、多Master多Slave模式(非同步複製)、多Master多Slave模式(同步雙寫)等。明確個概念,RocketMQ Slave不可以寫,可以讀,類似於MySQL的主從機制。
單Master模式:
無需多言,一旦單個broker重啟或當機,一切都結束了!很顯然,線上不可以使用。
多Master模式:
全是Master,沒有Slave。當然,一個broker當機了,應用是無影響的,缺點在於當機的Master上未被消費的訊息在Master沒有恢復之前不可以訂閱。
多Master多Slave模式(非同步複製):
多對Master-Slave,高可用!採用非同步複製的方式,主備之間短暫延遲,MS級別。Master當機,消費者可以從Slave上進行消費,不受影響,但是Master的當機,會導致丟失掉極少量的訊息。
多Master多Slave模式(同步雙寫):
和上面的區別點在於採用的是同步方式,也就是在Master/Slave都寫成功的前提下,嚮應用返回成功,可見不論是資料,還是服務都沒有單點,都非常可靠!缺點在於同步的效能比非同步稍低。
這裡我將採用2個Master的方式進行搭建演示,會了雙Master,其他的將很簡單。(多Master在實際中也是非常常用的,如果併發非常大,考慮多Master多Slave模式)
雙Master模式架構
在192.168.99.121/122機器上各一個NameServer、Master程式。
以192.168.99.121為例:
第一步,修改/etc/hosts檔案
hosts配置
確保相互之間可以ping通
第二步,解壓並建立儲存路徑
tar -xvf alibaba-rocketmq-3.2.6.tar.gz
mkdir -p alibaba-rocketmq/store/{commitlog,consumequeue,index}
複製程式碼
第三步,配置檔案
broker-x.properties
上面已經將實際中常用的配置項給出來了!
配置項
第四步,修改日誌配置檔案
注意到logback.*.xml配置檔案中:
需要替換${user.name}
可以使用sed進行替換:
sed -i 's#${user.home}#/software/alibaba-rocketmq#g' *.xml
複製程式碼
第五步,修改啟動指令碼中的JVM引數
vim runbroker.sh/rumserver.sh
注意,在這裡我將JVM的堆的初始化和最大大小統一設定為1G,並將新生代大小設定為512M。主要是考慮到我的虛擬機器記憶體,實際上線上上是可以走預設的4G堆記憶體的。
第六步,啟動NameServer
nohup sh mqnamesrv &複製程式碼
NameServer
nameserver啟動日誌
第七步,啟動broker-X
啟動broker
注意觀察日誌:
broker.log
程式與埠
第八步:RocketMQ Console
把rocketmq-console.war部署到Tomcat下即可。
解壓WAR包
在解壓WAR包後的CLASS下更改config.properties
這個管控臺實際上還是比較簡陋的,我們使用比較多的是mqadmin操作命令,後續會介紹。