阿里巴巴有2大核心的分布式技術(shù),一個(gè)是OceanBase,另一個(gè)就是RocketMQ。在實(shí)際項(xiàng)目中已經(jīng)領(lǐng)教過(guò)RocketMQ的強(qiáng)大,本人計(jì)劃寫(xiě)一個(gè)RocketMQ實(shí)戰(zhàn)系列,將涵蓋RocketMQ的簡(jiǎn)介,環(huán)境搭建,初步使用、API詳解、架構(gòu)分析、管理員集群操作等知識(shí)。
What is RocketMQ?
RocketMQ作為一款分布式的消息中間件(阿里的說(shuō)法是不遵循任何規(guī)范的,所以不能完全用JMS的那一套東西來(lái)看它),經(jīng)歷了Metaq1.x、Metaq2.x的發(fā)展和淘寶雙十一的洗禮,在功能和性能上遠(yuǎn)超ActiveMQ。
1.要知道RocketMQ原生就是支持分布式的,而ActiveMQ原生存在單點(diǎn)性。
2.RocketMQ可以保證嚴(yán)格的消息順序,而ActiveMQ無(wú)法保證!
3.RocketMQ提供億級(jí)消息的堆積能力,這不是重點(diǎn),重點(diǎn)是堆積了億級(jí)的消息后,依然保持寫(xiě)入低延遲!
4.豐富的消息拉取模式(Push or Pull)
Push好理解,比如在消費(fèi)者端設(shè)置Listener回調(diào);而Pull,控制權(quán)在于應(yīng)用,即應(yīng)用需要主動(dòng)的調(diào)用拉消息方法從Broker獲取消息,這里面存在一個(gè)消費(fèi)位置記錄的問(wèn)題(如果不記錄,會(huì)導(dǎo)致消息重復(fù)消費(fèi))。
5.在Metaq1.x/2.x的版本中,分布式協(xié)調(diào)采用的是Zookeeper,而RocketMQ自己實(shí)現(xiàn)了一個(gè)NameServer,更加輕量級(jí),性能更好!
6.消息失敗重試機(jī)制、高效的訂閱者水平擴(kuò)展能力、強(qiáng)大的API、事務(wù)機(jī)制等等(后續(xù)詳細(xì)介紹)
初步理解Producer/Consumer Group
ActiveMQ中并沒(méi)有Group這個(gè)概念,而在RocketMQ中理解Group的機(jī)制很重要。
想過(guò)沒(méi)有,通過(guò)Group機(jī)制,讓RocketMQ天然的支持消息負(fù)載均衡!
比如某個(gè)Topic有9條消息,其中一個(gè)Consumer Group有3個(gè)實(shí)例(3個(gè)進(jìn)程 OR 3臺(tái)機(jī)器),那么每個(gè)實(shí)例將均攤3條消息?。ㄗ⒁釸ocketMQ只有一種模式,即發(fā)布訂閱模式。)
install RocketMQ
RocketMQ的Broker集群部署模式還挺多的,比如單Master模式、多Master模式、多Master多Slave模式(異步復(fù)制)、多Master多Slave模式(同步雙寫(xiě))等。明確個(gè)概念,RocketMQ Slave不可以寫(xiě),可以讀,類(lèi)似于MySQL的主從機(jī)制。
單Master模式:
無(wú)需多言,一旦單個(gè)broker重啟或宕機(jī),一切都結(jié)束了!很顯然,線(xiàn)上不可以使用。
多Master模式:
全是Master,沒(méi)有Slave。當(dāng)然,一個(gè)broker宕機(jī)了,應(yīng)用是無(wú)影響的,缺點(diǎn)在于宕機(jī)的Master上未被消費(fèi)的消息在Master沒(méi)有恢復(fù)之前不可以訂閱。
多Master多Slave模式(異步復(fù)制):
多對(duì)Master-Slave,高可用!采用異步復(fù)制的方式,主備之間短暫延遲,MS級(jí)別。Master宕機(jī),消費(fèi)者可以從Slave上進(jìn)行消費(fèi),不受影響,但是Master的宕機(jī),會(huì)導(dǎo)致丟失掉極少量的消息。
多Master多Slave模式(同步雙寫(xiě)):
和上面的區(qū)別點(diǎn)在于采用的是同步方式,也就是在Master/Slave都寫(xiě)成功的前提下,向應(yīng)用返回成功,可見(jiàn)不論是數(shù)據(jù),還是服務(wù)都沒(méi)有單點(diǎn),都非常可靠!缺點(diǎn)在于同步的性能比異步稍低。
這里我將采用2個(gè)Master的方式進(jìn)行搭建演示,會(huì)了雙Master,其他的將很簡(jiǎn)單。(多Master在實(shí)際中也是非常常用的,如果并發(fā)非常大,考慮多Master多Slave模式)
在192.168.99.121/122機(jī)器上各一個(gè)NameServer、Master進(jìn)程。
以192.168.99.121為例:
第一步,修改/etc/hosts文件
第二步,解壓并創(chuàng)建存儲(chǔ)路徑
tar -xvf alibaba-rocketmq-3.2.6.tar.gz
mkdir -p alibaba-rocketmq/store/{commitlog,consumequeue,index}
第三步,配置文件
上面已經(jīng)將實(shí)際中常用的配置項(xiàng)給出來(lái)了!
第四步,修改日志配置文件
注意到logback.*.xml配置文件中:
可以使用sed進(jìn)行替換:
sed -i 's#${user.home}#/software/alibaba-rocketmq#g' *.xml
第五步,修改啟動(dòng)腳本中的JVM參數(shù)
注意,在這里我將JVM的堆的初始化和最大大小統(tǒng)一設(shè)置為1G,并將新生代大小設(shè)置為512M。主要是考慮到我的虛擬機(jī)內(nèi)存,實(shí)際上在線(xiàn)上是可以走默認(rèn)的4G堆內(nèi)存的。
第六步,啟動(dòng)NameServer
nohup sh mqnamesrv &
第七步,啟動(dòng)broker-X
注意觀(guān)察日志:
第八步:RocketMQ Console
把rocketmq-console.war部署到Tomcat下即可。
這個(gè)管控臺(tái)實(shí)際上還是比較簡(jiǎn)陋的,我們使用比較多的是mqadmin操作命令,后續(xù)會(huì)介紹。
OK,到這里,雙Master的搭建已經(jīng)完成了!
本篇博客到此為止,下期再見(jiàn),晚安!