簡介
阿里出品,性能高但可視化頁面太low,商用的的話,要求真正的懂她(阿里有商用版,在阿里雲可以購買)
集羣支持
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上。
集羣搭建:2M-2S-SYNC(兩主兩從同步寫)
環境準備
- 環境準備:rocket-4.7.0 ,JDK1.8 並配置好環境變量
- 定好4個節點的端口,我這裏主節點爲默認10911,從節點設置成 10950,另外nameserver都是默認9876端口,別忘了設置防火牆。
- 兩臺主機分別是152.168.1.88,152.168.1.98(4個節點)
修改參數和創建數據存儲路徑
設置好節點的數據存儲路徑
mkdir /opt/rocketmq/rocketmq/data
mkdir /opt/rocketmq/rocketmq/data /store 存儲路徑
mkdir /opt/rocketmq/rocketmq/data /store/commitlog //commitLog 存儲路徑
mkdir /opt/rocketmq/rocketmq/data a/store/consumequeue //消費隊列存儲路徑存儲路徑
mkdir /opt/rocketmq/rocketmq/data /store/index //消息索引存儲路徑
記得修改兩臺機器上的 runbroker.sh 與 runserver.sh 的虛擬機參數。
runbroker.sh:
runserver.sh
修改xml文件配置:
進出$ROCKETMQ-HOME/conf目錄執行如下命令:
sed -i 's#${user.home}#/opt/rocketmq/rocketmq#g' *.xml
152.168.1.88主機
用於broker-a的主,broker-b的從,分別對應如下2個文件:
${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-a.properties
${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-b-s.properties
Ps
建議在/etc/hosts配置域名,在以下文件中使用域名
broker-a.properties
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=152.168.1.88:9876;152.168.1.98:9876
#store存儲路徑,master與slave目錄要不同
storePathRootDir=/opt/rocketmq/rocketmq/data/store
#commitLog存儲路徑
storePathCommitLog=/opt/rocketmq/rocketmq/data/store/commitlog
brokerIP1=152.168.1.88
#很重要 slave通信用
brokerIP2=152.168.1.98
broker-b-s.properties
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
brokerIP1=152.168.1.88
deleteWhen=04
listenPort=10950
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=152.168.1.88:9876;152.168.1.98:9876
storePathRootDir=/opt/rocketmq/rocketmq/data/store/slave
storePathCommitLog=/opt/rocketmq/rocketmq/data/store/slave/commitlog
然後分別執行:
nohup sh mqnamesrv &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a.properties &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties &
152.168.1.98主機
用於broker-b的主,broker-a的從,分別對應如下2個文件:
${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-a-s.properties
${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-b.properties
broker-a-s.properties
brokerClusterName=DefaultCluster
brokerName=broker-a
listenPort=10950
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerIP1=152.168.1.98
brokerRole=SLAVE
namesrvAddr=152.168.1.88:9876;152.168.1.98:9876
storePathRootDir=/opt/rocketmq/rocketmq/data/store/slave
storePathCommitLog=/opt/rocketmq/rocketmq/data/store/slave/commitlog
flushDiskType=ASYNC_FLUSH
broker-b.properties
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
brokerIP1=152.168.1.98
deleteWhen=04
fileReservedTime=48
namesrvAddr=152.168.1.88:9876;152.168.1.98:9876
storePathRootDir=/opt/rocketmq/rocketmq/data/store
storePathCommitLog=/opt/rocketmq/rocketmq/data/store/commitlog
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
brokerIP2=152.168.1.88
配置詳解
//集羣名稱,如果多個master,那麼每個master配置的名稱應該一致,要不然識別不了
brokerClusterName=rocketmq-cluster
//broker名稱
brokerName=broker-a
//0 表示master,>0 表示slave
brokerId=0
//nameServer地址,分號隔開,生產環境使用域名(好維護)
namesrvAddr=192.168.5.100:9876;192.168.5.101:9876
//在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
//是否允許broker自動創建topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
//是否允許broker自動創建訂閱組,建議線下開始,線上關閉
autoCreateSubscriptionGroup=true
//broker對外服務的監聽端口,
//同一臺機器部署多個broker,端口號要不同,且端口號之間要相距大些(主節點)
listenPort=10911
//刪除文件的時間節點,默認凌晨4點
deleteWhen=04
//文件保留時間,默認48小時
fileReservedTime=48
//commitLog每個文件的大小,默認大小1g
mapedFileSizeCommitLog=1073741824
//consumeQueue每個文件默認存30w條,根據自身業務進行調整
mapedFileSizeConsumeQueue=300000
destroyMapedFileInterval=120000
redeleteHangedFileInterval=120000
//檢查物理文件磁盤空間
diskMaxUsedSpaceRatio=88
//store存儲路徑,master與slave目錄要不同
storePathRootDir=/mysoft/rocketmq/data/store
//commitLog存儲路徑
storePathCommitLog=/mysoft/rocketmq/data/store/commitlog
//限制的消息大小
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=false
//發消息線程池數
sendMessageThreadPoolNums=128
//拉去消息線程池數
pullMessageThreadPoolNums=128
//broker角色:
//ASYSC_MASTER 異步複製master
//SYSC_MASTER 同步複製master
//SLAVE 從
brokerRole=SYSC_MASTER
///刷盤方式
//ASYNC_FLUSH 異步刷盤
//SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
啓動
nohup sh mqnamesrv &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b.properties &
驗證
sh mqadmin clusterlist -n 152.168.1.88:9876
配置參考
Broker參數
■Broker配置參數 |
|
|
|
# |
參數名 |
默認值 |
說明 |
2 |
listenPort |
10911 |
broker的服務端口號,作爲對producer和consumer使用服務的端口號 |
3 |
namesrvAddr |
null |
namesrv的ip地址。格式: ip:port;ip:port |
4 |
brokerIP1 |
本機IP |
broker所在的機器ip,默認不用設置,如果機器有多個網卡,需要手動設置 |
5 |
brokerName |
本機主機名 |
作用爲一組master與slave通過brokerName是否相同來標示,通過brokerId來區分master還是slave |
6 |
brokerClusterName |
DefaultCluster |
整個broker集羣的名字,創建topic時需要指定。 |
7 |
brokerId |
0 |
0:master 非0:slave |
8 |
storePathCommitLog |
$HOME/store/commitlog/ |
commitLog存儲路徑 |
9 |
storePathConsumerQueue |
$HOME/store/consumequeue/ |
消費隊列存儲路徑 |
10 |
mapedFileSizeCommitLog |
1024 * 1024 * 1024(1G) |
commitLog每個文件的大小,默認1G |
11 |
deleteWhen |
4 |
刪除文件時間點,默認凌晨 4點 |
12 |
fileReservedTime |
72 |
文件保留時間,默認72小時. |
13 |
brokerRole |
ASYNC_MASTER |
Broker 的角色 |
14 |
flushDiskType |
ASYNC_FLUSH |
刷盤方式 |
15 |
defaultTopicQueueNums |
4 |
在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數。 |
16 |
autoCreateTopicEnable |
true |
是否自動創建topic。 |
17 |
autoCreateSubscriptionGroup |
true |
是否允許Broker自動創建訂閱組,建議線下開啓,線上關閉 |
18 |
rejectTransactionMessage |
false |
是否拒絕事務消息接入 |
19 |
etchNamesrvAddrByAddressServer |
false |
是否從web服務器獲取Name Server地址,針對大規模的Broker集羣建議使用這種方式 |
20 |
storePathIndex |
$HOME/store/index |
消息索引存儲路徑 |
21 |
storeCheckpoint |
$HOME/store/checkpoint |
checkpoint文件存儲路徑 |
22 |
abortFile |
$HOME/store/abort |
abort文件存儲路徑 |
23 |
maxTransferBytesOnMessageInMemory |
262144 |
單次Pull消息(內存)傳輸的最大字節數 |
24 |
maxTransferCountOnMessageInMemory |
32 |
單次Pull消息(內存)傳輸的最大條數 |
25 |
maxTransferBytesOnMessageInDisk |
65536 |
單次Pull消息(磁盤)傳輸的最大字節數 |
26 |
maxTransferCountOnMessageInDisk |
8 |
單次Pull消息(磁盤)傳輸的最大條數 |
27 |
messageIndexEnable |
true |
是否開啓消息索引功能 |
28 |
messageIndexSafe |
false |
是否提供安全的消息索引機制,索引保證不丟 |
29 |
haMasterAddress |
|
在Slave上直接設置Master地址,默認從Name Server上自動獲取,也可以手工強制配置 |
30 |
cleanFileForciblyEnable |
true |
磁盤滿、且無過期文件情況下 TRUE 表示強制刪除文件,優先保證服務可用 FALSE 標記服務不可用,文件不刪除 |
Consumer參數
DefaultMQProducer、TransactionMQProducer、DefaultMQPushConsumer、DefaultMQPullConsumer都繼承與ClientConfig類,
|
|||
■客戶端的公共配置 |
|
|
|
# |
參數名 |
默認值 |
說明 |
1 |
namesrvAddr |
|
Name Server地址列表,多個NameServer地址用分號隔開 |
2 |
clientIP |
本機IP |
客戶端本機IP地址,某些機器會發生無法識別客戶端IP地址情況,需要應用在代碼中強制指定 |
3 |
instanceName |
DEFAULT |
客戶端實例名稱,客戶端創建的多個Producer、Consumer實際是共用一個內部實例(這個實例包含網絡連接、線程資源等) |
4 |
clientCallbackExecutorThreads |
4 |
通信層異步回調線程數 |
5 |
pollNameServerInteval |
30000 |
輪詢Name Server間隔時間,單位毫秒 |
6 |
heartbeatBrokerInterval |
30000 |
向Broker發送心跳間隔時間,單位毫秒 |
7 |
persistConsumerOffsetInterval |
5000 |
持久化Consumer消費進度間隔時間,單位毫秒 |
Producer參數
■Producer配置 |
|||
# |
參數名 |
默認值 |
說明 |
1 |
producerGroup |
DEFAULT_PRODUCER |
Producer組名,多個Producer如果屬於一個應用,發送同樣的消息,則應該將它們歸爲同一組 |
2 |
createTopicKey |
TBW102 |
在發送消息時,自動創建服務器不存在的topic,需要指定Key。 |
3 |
defaultTopicQueueNums |
4 |
在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數 |
4 |
sendMsgTimeout |
10000 |
發送消息超時時間,單位毫秒 |
5 |
compressMsgBodyOverHowmuch |
4096 |
消息Body超過多大開始壓縮(Consumer收到消息會自動解壓縮),單位字節 |
6 |
retryAnotherBrokerWhenNotStoreOK |
FALSE |
如果發送消息返回sendResult,但是sendStatus!=SEND_OK,是否重試發送 |
7 |
maxMessageSize |
131072 |
客戶端限制的消息大小,超過報錯,同時服務端也會限制 |
8 |
transactionCheckListener |
|
事務消息回查監聽器,如果發送事務消息,必須設置 |
9 |
checkThreadPoolMinSize |
1 |
Broker回查Producer事務狀態時,線程池大小 |
10 |
checkThreadPoolMaxSize |
|
Broker回查Producer事務狀態時,線程池大小 |
11 |
checkRequestHoldMax |
2000 |
Broker回查Producer事務狀態時,Producer本地緩衝請求隊列大小 |
|
|
|
|
■Push Consumer配置 |
|
|
|
# |
參數名 |
默認值 |
說明 |
1 |
consumerGroup |
DEFAULT_CONSUMER |
Consumer組名,多個Consumer如果屬於一個應用,訂閱同樣的消息,且消費邏輯一致,則應該將它們歸爲同一組 |
2 |
messageModel |
CLUSTERING |
消息模型,支持以下兩種 |
3 |
consumeFromWhere |
CONSUME_FROM_LAST_OFFSET |
Consumer啓動後,默認從什麼位置開始消費 |
4 |
allocateMessageQueueStrategy |
AllocateMessageQueueAveragely |
Rebalance算法實現策略 |
5 |
subscription |
{} |
訂閱關係 |
6 |
messageListener |
|
消息監聽器 |
7 |
offsetStore |
|
消費進度存儲 |
8 |
consumeThreadMin |
10 |
消費線程池數量 |
9 |
consumeThreadMax |
20 |
消費線程池數量 |
10 |
consumeConcurrentlyMaxSpan |
2000 |
單隊列並行消費允許的最大跨度 |
11 |
pullThresholdForQueue |
1000 |
拉消息本地隊列緩存消息最大數 |
12 |
pullInterval |
0 |
拉消息間隔,由於是長輪詢,所以爲0,但是如果應用爲了流控,也可以設置大於0的值,單位毫秒 |
13 |
consumeMessageBatchMaxSize |
1 |
批量消費,一次消費多少條消息 |
14 |
pullBatchSize |
32 |
批量拉消息,一次最多拉多少條 |
|
|
|
|
■Pull Consumer配置 |
|
|
|
# |
參數名 |
默認值 |
說明 |
1 |
consumerGroup |
DEFAULT_CONSUMER |
Consumer組名,多個Consumer如果屬於一個應用,訂閱同樣的消息,且消費邏輯一致,則應該將它們歸爲同一組 |
2 |
brokerSuspendMaxTimeMillis |
20000 |
長輪詢,Consumer拉消息請求在Broker掛起最長時間,單位毫秒 |
3 |
consumerTimeoutMillisWhenSuspend |
30000 |
長輪詢,Consumer拉消息請求在Broker掛起超過指定時間,客戶端認爲超時,單位毫秒 |
4 |
consumerPullTimeoutMillis |
10000 |
非長輪詢,拉消息超時時間,單位毫秒 |
5 |
messageModel |
BROADCASTING |
消息模型,支持以下兩種 |
6 |
messageQueueListener |
|
監聽隊列變化 |
7 |
offsetStore |
|
消費進度存儲 |
8 |
registerTopics |
[] |
註冊的topic集合 |
9 |
allocateMessageQueueStrategy |
AllocateMessageQueueAveragely |
Rebalance算法實現策略 |
Meesage數據結構
Message數據結構各個字段都可以通過get、set方式訪問,例如訪問topic: |
|||
字段名 |
默認值 |
必填 |
說明 |
Topic |
null |
○ |
線下環境不需要申請,線上環境需要申請後才能使用 |
Body |
null |
○ |
二進制形式,序列化由應用決定,Producer與Consumer要協商好序列化形式。 |
Tags |
null |
|
類似於Gmail爲每封郵件設置的標籤,方便服務器過濾使用。目前只支持每個消息設置一個tag,所以也可以類比爲Notify的MessageType概念。 |
Keys |
null |
|
代表這條消息的業務關鍵詞,服務器會根據keys創建哈希索引,設置後,可以再Console系統根據Topic、Keys來查詢消息,由於是哈希索引,請儘可能保證key唯一,例如訂單號,商品ID等。 |
Flag |
0 |
|
完全由應用來設置,RocketMQ不做敢於。 |
DelayTimeLevel |
0 |
|
消息延時級別,0表示不延時,大於0會延時特定的時間纔會被消費。 |
WaitStoreMsgOK |
TRUE |
|
表示消息是否在服務器羅盤後才返回應答。 |
Java代碼測試
Springboot+netty+rocketmq測試
配置:
rocketmq.name-server=152.168.1.88:9876
rocketmq.producer.group=rocketmq-group
rocketmq.producer.send-message-timeout=5000
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<!--rocketMq依賴-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
效果