Docker安裝部署單機(jī)版Rocket及基礎(chǔ)講解
前言
目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Rocketmq相比于Rabbitmq、kafka具有主要優(yōu)勢(shì)特性有:
- 支持事務(wù)消息(能夠解決分布式事務(wù)的問(wèn)題)
- 支持順序消息(底層已經(jīng)使用內(nèi)存隊(duì)列實(shí)現(xiàn))
- 支持consumer端tag過(guò)濾,減少不必要的網(wǎng)絡(luò)傳輸
Rocketmq就是對(duì)kafka實(shí)現(xiàn)的升級(jí)版本。
優(yōu)缺點(diǎn)
RocketMQ 優(yōu)點(diǎn)
- 單機(jī)吞吐量:十萬(wàn)級(jí)
- 可用性:非常高,分布式架構(gòu)
- 消息可靠性:經(jīng)過(guò)參數(shù)優(yōu)化配置,消息可以做到 0 丟失
- 功能支持:MQ 功能較為完善,還是分布式的,擴(kuò)展性好
- 支持 10 億級(jí)別的消息堆積,不會(huì)因?yàn)槎逊e導(dǎo)致性能下降
- 源碼是 Java,方便結(jié)合公司自己的業(yè)務(wù)進(jìn)行二次開(kāi)發(fā)
- 天生為金融互聯(lián)網(wǎng)領(lǐng)域而生,對(duì)于可靠性要求很高的場(chǎng)景,尤其是電商里面的訂單扣款,以及業(yè)務(wù)削峰,在大量交易涌入時(shí),后端可能無(wú)法及時(shí)處理的情況
- RoketMQ 在穩(wěn)定性上可能更值得信賴,這些業(yè)務(wù)場(chǎng)景在阿里雙11已經(jīng)經(jīng)歷了多次考驗(yàn)
RocketMQ 缺點(diǎn)
- 支持的客戶端語(yǔ)言不多,目前僅支持 Java 及 C++,而且 C++ 還不成熟
- 沒(méi)有在 MQ 核心中去實(shí)現(xiàn) JMS 等接口,有些系統(tǒng)要遷移需要修改大量代碼
常見(jiàn)名詞介紹
- provider
消息生產(chǎn)者,位于用戶的進(jìn)程內(nèi),Producer通過(guò)NameServer獲取所有Broker的路由信息,根據(jù)負(fù)載均衡策略選擇將消息發(fā)到哪個(gè)Broker,然后調(diào)用Broker接口提交消息。
- provider group
生產(chǎn)者組,簡(jiǎn)單來(lái)說(shuō)就是多個(gè)發(fā)送同一類(lèi)消息的生產(chǎn)者稱(chēng)之為一個(gè)生產(chǎn)者組。
- consumer
消息消費(fèi)者,位于用戶進(jìn)程內(nèi)。Consumer通過(guò)NameServer獲取所有broker的路由信息后,向Broker發(fā)送Pull請(qǐng)求來(lái)獲取消息數(shù)據(jù)。Consumer可以以兩種模式啟動(dòng),廣播(Broadcast)和集群(Cluster),廣播模式下,一條消息會(huì)發(fā)送給所有Consumer,集群模式下消息只會(huì)發(fā)送給一個(gè)Consumer。
- consumer group
消費(fèi)者組,和生產(chǎn)者類(lèi)似,消費(fèi)同一類(lèi)消息的多個(gè) Consumer 實(shí)例組成一個(gè)消費(fèi)者組。
- Topic Topic
用于將消息按主題做劃分,Producer將消息發(fā)往指定的Topic,Consumer訂閱該Topic就可以收到這條消息。Topic跟發(fā)送方和消費(fèi)方都沒(méi)有強(qiáng)關(guān)聯(lián)關(guān)系,發(fā)送方可以同時(shí)往多個(gè)Topic投放消息,消費(fèi)方也可以訂閱多個(gè)Topic的消息。在RocketMQ中,Topic是一個(gè)上邏輯概念。消息存儲(chǔ)不會(huì)按Topic分開(kāi)。
- Message
代表一條消息,使用MessageId唯一識(shí)別,用戶在發(fā)送時(shí)可以設(shè)置messageKey,便于之后查詢和跟蹤。一個(gè) Message 必須指定 Topic,相當(dāng)于寄信的地址。Message 還有一個(gè)可選的 Tag 設(shè)置,以便消費(fèi)端可以基于 Tag 進(jìn)行過(guò)濾消息。也可以添加額外的鍵值對(duì),例如你需要一個(gè)業(yè)務(wù) key 來(lái)查找 Broker 上的消息,方便在開(kāi)發(fā)過(guò)程中診斷問(wèn)題。
- Tag 標(biāo)簽
可以被認(rèn)為是對(duì) Topic 進(jìn)一步細(xì)化。一般在相同業(yè)務(wù)模塊中通過(guò)引入標(biāo)簽來(lái)標(biāo)記不同用途的消息。
- Broker Broker
是RocketMQ的核心模塊,負(fù)責(zé)接收并存儲(chǔ)消息,同時(shí)提供Push/Pull接口來(lái)將消息發(fā)送給Consumer。Consumer可選擇從Master或者Slave讀取數(shù)據(jù)。多個(gè)主/從組成Broker集群,集群內(nèi)的Master節(jié)點(diǎn)之間不做數(shù)據(jù)交互。Broker同時(shí)提供消息查詢的功能,可以通過(guò)MessageID和MessageKey來(lái)查詢消息。Borker會(huì)將自己的Topic配置信息實(shí)時(shí)同步到NameServer。
- Queue Topic
Queue Topic和Queue是1對(duì)多的關(guān)系,一個(gè)Topic下可以包含多個(gè)Queue,主要用于負(fù)載均衡。發(fā)送消息時(shí),用戶只指定Topic,Producer會(huì)根據(jù)Topic的路由信息選擇具體發(fā)到哪個(gè)Queue上。Consumer訂閱消息時(shí),會(huì)根據(jù)負(fù)載均衡策略決定訂閱哪些Queue的消息。
- Offset
是RocketMQ在存儲(chǔ)消息時(shí)會(huì)為每個(gè)Topic下的每個(gè)Queue生成一個(gè)消息的索引文件,每個(gè)Queue都對(duì)應(yīng)一個(gè)Offset記錄當(dāng)前Queue中消息條數(shù)。
- NameServer
NameServer可以看作是RocketMQ的注冊(cè)中心,它管理兩部分?jǐn)?shù)據(jù):集群的Topic-Queue的路由配置;Broker的實(shí)時(shí)配置信息。其它模塊通過(guò)Nameserver提供的接口獲取最新的Topic配置和路由信息。
- Producer/Consumer
通過(guò)查詢接口獲取Topic對(duì)應(yīng)的Broker的地址信息
- Broker
注冊(cè)配置信息到NameServer, 實(shí)時(shí)更新Topic信息到NameServer
單機(jī)版安裝部署
這里用作學(xué)習(xí)使用,所以使用docker安裝,安裝速度快。
1、安裝啟動(dòng)nameserver
服務(wù)
docker run -d -p 9876:9876 -v /opt/rocketmq/data/namesrv/logs:/root/logs -v /opt/rocketmq/data/namesrv/store:/root/store --name rmqnamesrv -e "MAX_POSSIBLE_HEAP=100000000" rocketmqinc/rocketmq sh mqnamesrv
2、安裝啟動(dòng)broker服務(wù)
根據(jù)容器卷配置,在指定位置添加broker.conf內(nèi)容 /opt/rocketmq/conf/broker.conf 。(可以不需要)
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = docker宿主機(jī)IP
啟動(dòng)broker服務(wù)
docker run -d -p 10911:10911 -p 10909:10909 -v /opt/rocketmq/data/broker/logs:/root/logs -v /opt/rocketmq/rocketmq/data/broker/store:/root/store -v /opt/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq/conf/broker.conf
3、安裝啟動(dòng)控制臺(tái)
docker run -d -e "JAVA_OPTS=-Drocketmq.config.namesrvAddr=nameserIP:9876 -Drocketmq.config.isVIPChannel=false" -p 8080:8080 --name rmqconsole -t styletang/rocketmq-console-ng
集群部署
集群部署原理圖
broker主備
主:
備:同步主節(jié)點(diǎn)的數(shù)據(jù),當(dāng)主節(jié)點(diǎn)宕機(jī)之后,可以從被變?yōu)橹鞅WC高可用。
在rocketmq中分為多主多從實(shí)現(xiàn)對(duì)我們topic數(shù)據(jù)實(shí)現(xiàn)分片存儲(chǔ)。
四種集群部署方式
- 單個(gè)Master節(jié)點(diǎn), 缺點(diǎn)就是如果宕機(jī)之后可能整個(gè)服務(wù)不可用;
- 多個(gè)Master節(jié)點(diǎn),分?jǐn)偞娣盼覀兊南ⅲ秉c(diǎn):沒(méi)有Slave節(jié)點(diǎn),主的Master節(jié)點(diǎn)宕機(jī)之后消息數(shù)據(jù)可能會(huì)丟失的;
- 多個(gè)Master和Slave節(jié)點(diǎn) 采用異步形式 效率非常高 數(shù)據(jù)可能短暫產(chǎn)生延遲(毫秒級(jí)別的)
- 多個(gè)Master和Slave節(jié)點(diǎn) 采用同步形式, 效率比較低、數(shù)據(jù)不會(huì)產(chǎn)生延遲。
集群部署
集群的部署主要在于配置文件,nameserver部署好之后,多個(gè)broker的配置文件中配置同一個(gè)nameserver 集群的連接信息,broker集群就搭建好了。之后 Rocketmq-console 連接其中一個(gè)nameserver就可以了。
配置文件說(shuō)明:
#集群名稱(chēng),可以區(qū)分不同集群,不同的業(yè)務(wù)可以建多個(gè)集群,多個(gè)broker的配置文件中的該值必須一樣
brokerClusterName=kaico# Broker 的名稱(chēng), Master 和Slave 通過(guò)使用相同的Broker 名稱(chēng)來(lái)表明相互關(guān)系,以說(shuō)明某個(gè)Slave 是哪個(gè)Master 的Slave 。
brokerName=broker-a
# 一個(gè)Master Barker 可以有多個(gè)Slave, 0 表示Master ,大于0 表示不同Slave 的ID 。
brokerId=0#與fileReservedTim巳參數(shù)呼應(yīng),表明在幾點(diǎn)做消息刪除動(dòng)作,默認(rèn)值04 表示凌晨4 點(diǎn)。
deleteWhen=04
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876
autoCreateTopicEnable=true #是否自動(dòng)創(chuàng)建主題(true為允許自動(dòng)創(chuàng)建集群)
#topic默認(rèn)創(chuàng)建的隊(duì)列數(shù)
defaultTopicQueueNums=4
#是否允許Broker自動(dòng)創(chuàng)建訂閱組,建議線下開(kāi)啟,線上關(guān)閉,默認(rèn)【true】
autoCreateSubscriptionGroup=true
#Broker 監(jiān)聽(tīng)的端口號(hào),如果一臺(tái)機(jī)器上啟動(dòng)了多個(gè)Broker , 則要設(shè)置不同的端口號(hào),避免沖突。
listenPort=10911
brokerIp=192.168.1.1
1、首先啟動(dòng)兩個(gè)nameserver服務(wù)
2、啟動(dòng)多個(gè)broker服務(wù)(這里安排兩個(gè))
第一個(gè)broker配置文件
brokerClusterName=kaico #集群名稱(chēng)
brokerName=broker-a #broker的名稱(chēng)
brokerId=0 #master節(jié)點(diǎn)的標(biāo)識(shí)(0表示是master節(jié)點(diǎn))
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876 #nameServer集群
第二個(gè)broker配置文件
brokerClusterName=kaico #集群名稱(chēng)
brokerName=broker-b #broker的名稱(chēng)
brokerId=0 #master節(jié)點(diǎn)的標(biāo)識(shí)(0表示是master節(jié)點(diǎn))
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876 #nameServer集群
啟動(dòng)方式:
- 先啟動(dòng)nameServer服務(wù)
- 再去啟動(dòng)broker,在啟動(dòng)broker的命令中可以指定nameServer的連接信息。
到此這篇關(guān)于Docker安裝部署單機(jī)版Rocket及基礎(chǔ)講解的文章就介紹到這了,更多相關(guān)Docker Rocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Docker+Jenkins+Gitlab+Django應(yīng)用部署實(shí)踐
這篇文章主要介紹了Docker+Jenkins+Gitlab+Django應(yīng)用部署實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01基于Docker部署GitLab環(huán)境搭建的方法步驟
這篇文章主要介紹了基于Docker部署GitLab環(huán)境搭建的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器)
容器中管理數(shù)據(jù)主要有兩種方式,這篇文章主要介紹了詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10完美解決Windows10下無(wú)法對(duì)docker容器進(jìn)行端口訪問(wèn)的操作
這篇文章主要介紹了完美解決Windows10下無(wú)法對(duì)docker容器進(jìn)行端口訪問(wèn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11