RocketMQ實戰系列從理論到實戰

阿里巴巴有2大核心的分佈式技術,一個是OceanBase,另外一個就是RocketMQ。在實際項目中已經領教過RocketMQ的強大,RocketMQ實戰系列,將涵蓋RocketMQ的簡介,環境搭建,初步使用、API詳解、架構分析、管理員集羣操做等知識。vim

What is RocketMQ?

RocketMQ做爲一款分佈式的消息中間件(阿里的說法是不遵循任何規範的,因此不能徹底用JMS的那一套東西來看它),經歷了Metaq1.x、Metaq2.x的發展和淘寶雙十一的洗禮,在功能和性能上遠超ActiveMQ。bash

  1. 要知道RocketMQ原生就是支持分佈式的,而ActiveMQ原生存在單點性。架構

  2. RocketMQ能夠保證嚴格的消息順序,而ActiveMQ沒法保證!併發

  3. RocketMQ提供億級消息的堆積能力,這不是重點,重點是堆積了億級的消息後,依然保持寫入低延遲!負載均衡

  4. 豐富的消息拉取模式(Push or Pull)
    Push好理解,好比在消費者端設置Listener回調;而Pull,控制權在於應用,即應用須要主動的調用拉消息方法從Broker獲取消息,這裏面存在一個消費位置記錄的問題(若是不記錄,會致使消息重複消費)。異步

  5. 在Metaq1.x/2.x的版本中,分佈式協調採用的是Zookeeper,而RocketMQ本身實現了一個NameServer,更加輕量級,性能更好!分佈式

  6. 消息失敗重試機制、高效的訂閱者水平擴展能力、強大的API、事務機制等等(後續詳細介紹)性能

初步理解Producer/Consumer Group

ActiveMQ中並無Group這個概念,而在RocketMQ中理解Group的機制很重要。spa

RocketMQ實戰(一)

Group機制3d

想過沒有,經過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模式)

RocketMQ實戰(一)

雙Master模式架構

在192.168.99.121/122機器上各一個NameServer、Master進程。

以192.168.99.121爲例:

第一步,修改/etc/hosts文件

RocketMQ實戰(一)

hosts配置


RocketMQ實戰(一)

確保相互之間能夠ping通

第二步,解壓並建立存儲路徑

tar -xvf alibaba-rocketmq-3.2.6.tar.gz

mkdir -p alibaba-rocketmq/store/{commitlog,consumequeue,index}
複製代碼

第三步,配置文件

RocketMQ實戰(一)

broker-x.properties

上面已經將實際中經常使用的配置項給出來了!

RocketMQ實戰(一)

配置項

第四步,修改日誌配置文件

RocketMQ實戰(一)

注意到logback.*.xml配置文件中:

RocketMQ實戰(一)

須要替換${user.name}

可使用sed進行替換:

sed -i 's#${user.home}#/software/alibaba-rocketmq#g' *.xml
複製代碼

第五步,修改啓動腳本中的JVM參數

RocketMQ實戰(一)

vim runbroker.sh/rumserver.sh

注意,在這裏我將JVM的堆的初始化和最大大小統一設置爲1G,並將新生代大小設置爲512M。主要是考慮到個人虛擬機內存,實際上在線上是能夠走默認的4G堆內存的。

第六步,啓動NameServer

nohup sh mqnamesrv &複製代碼

RocketMQ實戰(一)

NameServer


RocketMQ實戰(一)

nameserver啓動日誌

第七步,啓動broker-X

RocketMQ實戰(一)

啓動broker

注意觀察日誌:

RocketMQ實戰(一)

broker.log


RocketMQ實戰(一)

進程與端口

第八步:RocketMQ Console

把rocketmq-console.war部署到Tomcat下便可。

RocketMQ實戰(一)

解壓WAR包


RocketMQ實戰(一)

在解壓WAR包後的CLASS下更改config.properties


RocketMQ實戰(一)


RocketMQ實戰(一)

這個管控臺實際上仍是比較簡陋的,咱們使用比較多的是mqadmin操做命令,後續會介紹。

相關文章
相關標籤/搜索