1. 程式人生 > 實用技巧 >1-rocketmq簡介-部署

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

http://rocketmq.apache.org/docs/motivation/