RocketMQ2環境搭建(Linux)+springboot+netty+rocketmq測試

 

簡介

阿里出品,性能高但可視化頁面太low,商用的的話,要求真正的懂她(阿里有商用版,在阿里雲可以購買)

集羣支持

  RocketMQ天生對集羣的支持非常友好

單Master:

  1. 優點:除了配置簡單沒什麼優點
  2. 缺點:不可靠,該機器重啓或宕機,將導致整個服務不可用

多Master:

  1. 優點:配置簡單,性能最高
  2. 缺點:可能會有少量消息丟失(配置相關),單臺機器重啓或宕機期間,該機器下未被消費的消息在機器恢復前不可訂閱,影響消息實時性
  3. 多Master多Slave異步模式:

  每個Master配一個Slave,有多對Master-Slave,集羣採用異步複製方式,主備有短暫消息延遲,毫秒級

  1. 優點:性能同多Master幾乎一樣,實時性高,主備間切換對應用透明,不需人工干預
  2. 缺點:Master宕機或磁盤損壞時會有少量消息丟失

 

多Master多Slave同步模式:

  每個Master配一個Slave,有多對Master-Slave,集羣採用同步雙寫方式,主備都寫成功,嚮應用返回成功

  1. 優點:服務可用性與數據可用性非常高
  2. 缺點:性能比異步集羣略低,當前版本主宕備不能自動切換爲主。

  需要注意的是,在RocketMQ裏面,1臺機器只能要麼是Master,要麼是Slave。這個在初始的機器配置裏面,就定死了。不會像kafka那樣存在master動態選舉的功能。其中Master的broker id = 0,Slave的broker id > 0。有點類似於mysql的主從概念,master掛了以後,slave仍然可以提供讀服務,但是由於有多主的存在,當一個master掛了以後,可以寫到其他的master上。

 

集羣搭建:2M-2S-SYNC(兩主兩從同步寫)

環境準備

  1. 環境準備:rocket-4.7.0 ,JDK1.8 並配置好環境變量

 

  1. 定好4個節點的端口,我這裏主節點爲默認10911,從節點設置成 10950,另外nameserver都是默認9876端口,別忘了設置防火牆。
  2. 兩臺主機分別是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 的角色
ASYNC_MASTER 異步複製Master
SYNC_MASTER 同步雙寫Master
SLAVE

14

flushDiskType

ASYNC_FLUSH

刷盤方式
ASYNC_FLUSH 異步刷盤
SYNC_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類,


ClientConfig爲客戶端的公共配置類。客戶端的配置都是get、set形式,每個參數都可以用spring來配置,也可以在代碼中配置,
例如namesrvAddr這個參數可以這樣配置,其他參數同理。
producer.setNamesrvAddr("192.168.0.1:9876");

■客戶端的公共配置

 

 

 

#

參數名

默認值

說明

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

消息模型,支持以下兩種
1、集羣消費(CLSUTER)
2、廣播消費(BROADCASTING)

3

consumeFromWhere

CONSUME_FROM_LAST_OFFSET

Consumer啓動後,默認從什麼位置開始消費
1、CONSUME_FROM_LAST_OFFSET:默認策略,從該隊列最尾開始消費,即跳過歷史消息
2、CONSUME_FROM_FIRST_OFFSET:從隊列最開始開始消費,即歷史消息(還儲存在broker的)全部消費一遍
3、CONSUME_FROM_TIMESTAMP:從某個時間點開始消費,和setConsumeTimestamp()配合使用,默認是半個小時以前

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

消息模型,支持以下兩種
1、集羣消費
2、廣播消費

6

messageQueueListener

 

監聽隊列變化

7

offsetStore

 

消費進度存儲

8

registerTopics

[]

註冊的topic集合

9

allocateMessageQueueStrategy

AllocateMessageQueueAveragely

Rebalance算法實現策略

 

Meesage數據結構

 

Message數據結構各個字段都可以通過get、set方式訪問,例如訪問topic:
msg.getTopic();
msg.setTopic("test");

字段名

默認值

必填

說明

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>

效果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章