1-rocketmq簡介-部署
簡介
基於java開發,高可用
應用場景
1、應用解耦
2、流量銷峰
3、非同步處理
4、訊息分發(郵件、簡訊、日誌、資料處理)
延時佇列場景:需要延時單次延遲執行的場景,比如訂單取消
常見問題
1、如何保證高可用
叢集部署
2、如何保證訊息不丟失(訊息的可靠性傳輸)
-
生產者丟失資料
開啟生產者確認模式,確認傳送成功了才對消費者可見
-
訊息佇列丟失資料
開啟訊息持久化,設定好刷盤策略
-
消費者丟失資料
假如是自動提交offset,訊息投遞後還沒有消費完就會被更新offset
開啟手動提交,確保訊息消費完了才被確認 -
叢集同步丟失
總結:傳送者確認模式開啟,訊息持久化預設開啟,消費者消費開啟手動ack
3、消費者冪等(如何確保訊息不被重複消費)
傳送時訊息重複
投遞時訊息重複
負載均衡時訊息重複
解決:
- 業務層做冪等,重複消費不影響
- 記錄訊息messageId重複訊息丟棄
4、如何保證訊息順序性
先保證入隊有序性,然後消費者通過業務邏輯保證訊息的順序消費
對比
特性 | ActiveMQ | RabbitMQ | RocketMQ | kafka |
---|---|---|---|---|
開發語言 | java | erlang | java | scala |
單機吞吐量 | 萬級 | 萬級 | 10萬級 | 10萬級 |
時效性 | ms級 | us級 | ms級 | ms級以內 |
可用性 | 高(主從架構) | 高(主從架構) | 非常高(分散式架構) | 非常高(分散式架構) |
功能特性 | 成熟的產品,在很多公司得到應用;有較多的文件;各種協議支援較好 | 基於erlang開發,所以併發能力很強,效能極其好,延時很低;管理介面較豐富 | MQ功能比較完備,擴充套件性佳 | 只支援主要的MQ功能,像一些訊息查詢,訊息回溯等功能沒有提供,畢竟是為大資料準備的,在大資料領域應用廣。 |
架構
組要的四個組成部分
1、NameServer :可叢集部署,節點之間無任何資訊同步。提供輕量級的服務發現和路由
2、Broker :分為Master 與Slave,一個Master 可以對應多個Slave,但是一個Slave 只能對應一個Master。Master 與Slave 的對應關係通過指定相同的BrokerName,不同的BrokerId來定 義,BrokerId為0 表示Master,非0 表示Slave。Master 也可以部署多個。只有brokerId=1的從伺服器才會參與訊息的讀負載,也就是當master掛掉後消費者依然能夠正常消費,消費者掛掉後生產者依然能夠正常傳送訊息
Broker主從沒有自動選舉,依靠配置檔案brokerId來指定
3、Producer:擁有相同 Producer Group 的 Producer 組成一個叢集, 與Name Server 叢集中的其中一個節點(隨機選擇)建立長連線,定期從Name Server 取Topic 路由資訊,並向提供Topic服務的Master 建立長連線,且定時向Master 傳送心跳。Producer 完全無狀態,可叢集部署。
4、Consumer :擁有相同 Consumer Group 的 Consumer 組成一個叢集,與Name Server 叢集中的其中一個節點(隨機選擇)建立長連線,定期從Name Server 取Topic 路由資訊,並向提供Topic 服務的Master、Slave 建立長連線,且定時向Master、Slave 傳送心跳。Consumer既可以從Master 訂閱訊息,也可以從Slave 訂閱訊息,訂閱規則由Broker 配置決定
部署
啟動nameserver
nohup sh mqnamesrv &
啟動broker
nohup sh bin/mqbroker -n ${namesrvIp}:9876 -c /conf/broker.conf &
-c可以指定broker.conf配置檔案。預設情況下會載入conf/broker.conf
記憶體配置修改
修改runbroker.sh和runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512g"
Xms 是指設定程式啟動時佔用記憶體大小。一般來講,大點,程式會啟動的快一點,但是也可能會導致機器暫時間變慢。
Xmx 是指設定程式執行期間最大可佔用的記憶體大小。如果程式執行需要佔用更多的記憶體,超出了這個設定值,就會丟擲OutOfMemory異常。
xmn 年輕代的heap大小,一般設定為Xmx的3、4分之一
Broker配置檔案詳解(broker.conf)
#nameserver地址
namesrvAddr= ip:port;ip:port
#Cluster名稱,如果叢集機器數比較多,可以分成多個cluster,每個cluster提供給不同的業務場景使用
brokerClusterName = DefaultCluster
#如果配置主從模式,master和slave需要配置相同的名稱來表名關係
brokerName = broker-a
# 0master 1-slave
brokerId = 0
#在磁碟上儲存訊息的時長,單位是小時,自動刪除超時的訊息
fileReservedTime = 48
#與 fileReservedTim巳 引數呼應,表明在幾點做訊息刪除動作,預設值 04 表示凌晨 4 點 。
deleteWhen = 04
#brokerRole 主從複製策略 有3種:
#SYNC MASTER
#ASYNC MASTER
#關鍵詞 SY1叫C 和 ASYNC 表示 Master 和 Slave 之間同步訊息的機制, SYNC 的意思是當 Slave 和 Master 訊息同步完成後,再返回傳送成功的狀態 。
brokerRole = ASYNC_MASTER
#flushDiskType 表示刷 盤策略,分為 SYNC_FLUSH 和 ASYNC_FLUSH 兩種,分別代表同步刷盤和非同步刷盤 。 同步刷盤情況下,訊息真正寫人磁碟後再返回成功狀態;非同步刷盤情況下,訊息寫入 page_cache 後就返回成功狀態 。
flushDiskType = ASYNC_FLUSH
#broker埠號
listenPort=10911
#topic不存在的情況下自動建立
autoCreateTopicEnable = true
#儲存訊息以及一些配置資訊的根目錄 每個broker需要配置不同的地址否則拋異常
#java.lang.RuntimeException: Lock failed,MQ already started
# at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:227)
# at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:853)
# at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
# at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
storePathRootDir=/home/rocketmq/store-a
#所屬叢集名字 brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣 brokerName=broker-a或者broker-b
#0 表示 Master, >0 表示 Slave brokerId=0
#nameServer地址,分號分割 namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在傳送訊息時,自動建立伺服器不存在的topic,預設建立的佇列數 defaultTopicQueueNums=4
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉 autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉 autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽埠 listenPort=10911
#刪除檔案時間點,預設凌晨 4點 deleteWhen=04
#檔案保留時間,預設 48 小時 fileReservedTime=120
#commitLog每個檔案的大小預設1G mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整 mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理檔案磁碟空間 diskMaxUsedSpaceRatio=88
#儲存路徑 storePathRootDir=/usr/local/rocketmq/store
#commitLog 儲存路徑 storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消費佇列儲存路徑儲存路徑 storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#訊息索引儲存路徑 storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 檔案儲存路徑 storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 檔案儲存路徑 abortFile=/usr/local/rocketmq/store/abort
#限制的訊息大小 maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 非同步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE brokerRole=ASYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤 flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發訊息執行緒池數量
#sendMessageThreadPoolNums=128
#拉訊息執行緒池數量
#pullMessageThreadPoolNums=128
配置檔案設定好後通過命令指定配置檔案路徑啟動Broker
nohup sh bin/mqbroker -c [配置檔案路徑] &
停止服務
sh mqshutdown broker
sh mqshutdown namesrv
叢集
叢集支援
RocketMQ天生對叢集的支援非常友好
單Master
優點:除了配置簡單沒什麼優點
缺點:不可靠,該機器重啟或宕機,將導致整個服務不可用
多Master
優點:配置簡單,效能最高
缺點:可能會有少量訊息丟失(配置相關),單臺機器重啟或宕機期間,該機器下未被消費的訊息在機器恢復前不可訂閱,影響訊息實時性
多Master多Slave
每個Master配一個Slave,有多對Master-Slave,叢集採用非同步複製方式,主備有短暫訊息延遲,毫秒級
優點:效能同多Master幾乎一樣,實時性高,主備間切換對應用透明,不需人工干預
缺點:Master宕機或磁碟損壞時會有少量訊息丟失
多Master多Slave
每個Master配一個Slave,有多對Master-Slave,叢集採用同步雙寫方式,主備都寫成功,嚮應用返回成功優點:服務可用性與資料可用性非常高
缺點:效能比非同步叢集略低,當前版本主宕備不能自動切換為主,需要注意的是,在RocketMQ裡面,1臺機器只能要麼是Master,要麼是Slave。這個在初始的機器配置裡面,就定死了。不會像kafka那樣存在master動態選舉的功能。其中Master的broker id = 0,Slave
的broker id > 0。
有點類似於mysql的主從概念,master掛了以後,slave仍然可以提供讀服務,但是由於有多主的存在,當一個master掛了以後,可以寫到其他的master上
控制面板
程式碼:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console
文件:https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md
配置檔案中指定其中一個namesrv地址
rocketmq.config.namesrvAddr=10.211.55.4:9876
或者後臺手動更新
可以通過面板建立topic
writeQueueNums表示producer傳送到的MessageQueue的佇列個數
readQueueNumbs表示Consumer讀取訊息的MessageQueue佇列個數,其實類似於kafka的分割槽的概念
這兩個值需要相等,在叢集模式下如果不相等,假如說writeQueueNums=6,readQueueNums=3, 那麼每個broker上會有3個queue的訊息是無法消費的。
https://help.aliyun.com/document_detail/29532.html?spm=a2c4g.11186623.6.541.15be3af90vnILO