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