
一、介紹
Apache RocketMQ是一個分布式、隊列模型的消息中間件,具有低延遲、高性能和高可靠、萬億級容量和靈活的可擴展性。核心組件由四部分組成:Name Servers,Brokers,Producer 和 Consumer;它們中的每一個都可以水平擴展,而沒有單一的故障節點。

- NameServer:是一個幾乎無狀態的節點,可集群部署,節點之間無任何信息同步
- Broker:部署相對復雜,Broker分為Master與Slave,一個Master可以對應多個Slaver,但是一個Slaver只能對應一個Master,Master與Slaver的對應關系通過指定相同的BrokerName,不同的BrokerId來定義,BrokerId為0表示Master,非0表示Slaver。Master可以部署多個。每個Broker與NameServer集群中的所有節點建立長連接,定時注冊Topic信息到所有的NameServer
- Producer:與NameServer集群中的其中一個節點(隨機選擇)建立長連接,定期從NameServer取Topic路由信息,並向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Produce完全無狀態,可集群部署
- Consumer:與NameServer集群中的其中一個節點(隨機選擇)建立長連接,定期從NameServer取Topic路由信息,並向提供Topic服務的Master、Slaver建立長連接,且定時向Master、Slaver發送心跳。Consumer即可從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定
二、MQ安裝部署
2.1. 下載
直接找最新版下載后解壓
http://rocketmq.apache.org/release_notes

2.2. 修改配置
修改 conf/broker.conf
添加以下配置

brokerIP1:配置broker所在服務器的ip地址,以便Name Server連接
修改 runserver.sh 和 runbroker.sh (可不改)
因為rocketMQ默認的啟動參數內存占用非常大,如果環境沒有這么多內存就必需修改JAVA_OPT參數
- runserver.sh

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
- runbroker.sh

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
2.3. 運行Name Server
nohup sh bin/mqnamesrv &
查看運行日志:tail -f ~/logs/rocketmqlogs/namesrv.log
2.4. 運行Broker
nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf &
通過-c參數指定配置文件
查看運行日志:tail -f ~/logs/rocketmqlogs/broker.log
2.5. 停止服務的方式
如果需要停止RocketMQ的服務,在生產環境不建議直接用kill,應該使用以下命令
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
三、安裝可視化管理界面
mvn clean package -Dmaven.test.skip=true
- 運行
nohup java -jar \
-Drocketmq.config.namesrvAddr=192.168.28.130:9876 \
-Drocketmq.config.isVIPChannel=false \
rocketmq-console-ng-1.0.0.jar &
四、常見異常處理
4.1. MQClientException: No route info of this topic, TopicTest1
4.1.1. 異常說明
在客戶端的 Producer 運行起來准備發送消息時拋異常為 “ No route info of this topic ” 異常產生的原因可能是:
Broker禁止自動創建Topic,且用戶沒有通過手工方式創建 TopicBroker沒有正確連接到Name ServerProducer沒有正確連接到Name Server
4.1.2. 解決辦法
- 排查1:
Broker禁止自動創建Topic,且用戶沒有通過手工方式創建Topic- 可以在rocketmq所在目錄下執行 " sh bin/mqbroker -m " 來查看 broker 的配置參數
- 如下所示,
autoCreateTopicEnable=true證明是沒有問題的

- 排查2:
Broker沒有正確連接到Name Server
通過查看broker的日志tail -f ~/logs/rocketmqlogs/broker.log看看有沒有錯誤信息
- 排查3:
Producer沒有正確連接到Name Server- 檢查程序連接
Name Server的地址有沒有錯 - 如果在雲服務器上,檢查安全組的配置
9876端口有沒有開發 - 看看有沒有打開防火牆,有的話設置防火牆開放
9876端口
bash [root@zlt rocketmq-all-4.5.0-bin-release]# firewall-cmd --zone=public --list-ports 8090/tcp 80/tcp 8080/tcp [root@zlt rocketmq-all-4.5.0-bin-release]# firewall-cmd --zone=public --add-port=9876/tcp --permanent success [root@zlt rocketmq-all-4.5.0-bin-release]# firewall-cmd --reload success [root@zlt rocketmq-all-4.5.0-bin-release]# firewall-cmd --zone=public --list-ports 9876/tcp 8090/tcp 80/tcp 8080/tcp
- 檢查程序連接
4.2. RemotingTooMuchRequestException: sendDefaultImpl call timeout
4.2.1. 異常說明
- 在客戶端的
Producer運行起來准備發送消息時拋異常如下 - 通常因為
Name Server連接不上Broker

4.2.2. 解決辦法
檢查 rocketmq-console 的集群頁簽,broker 的地址是否正確

broker地址的配置方式請參考 安裝部署 中提到的步驟:
- 修改
broker.conf的配置,添加brokerIP1參數 - 啟動
broker時加上-c參數指定配置文件
4.3. 消費/查看不了死信隊列topic的消息

4.3.1. 異常說明
死信隊列默認的 perm 值為2沒有查看權限
4.3.2. 解決辦法
在控制台把隊列的 perm 改為6就可以了
**主題點擊 TOPIC配置 **

修改perm

推薦閱讀
- 日志排查問題困難?分布式日志鏈路跟蹤來幫你
- zuul集成Sentinel最新的網關流控組件
- 阿里注冊中心Nacos生產部署方案
- Spring Boot自定義配置項在IDE里面實現自動提示
- Spring Cloud Zuul的動態路由怎樣做?集成Nacos實現很簡單
- Spring Cloud開發人員如何解決服務沖突和實例亂竄?
- Spring Cloud同步場景分布式事務怎樣做?試試Seata
掃碼關注有驚喜!


