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