RocketMQ
介紹與概念
在github上的說法來看: Apache RocketMQ是一個分布式消息傳遞和流媒體平台,具有低延遲,高性能和可靠性,萬億級容量和靈活的可擴展性。它提供了多種功能:
- 發布/訂閱消息模型和點對點
- 預定的消息傳遞
- 消息追溯性按時間或偏移量
- 記錄流媒體的中心
- 大數據集成
- 可靠的FIFO和嚴格的有序消息傳遞在同一隊列中
- 高效的推拉消費模式
- 單個隊列中的百萬級消息累積容量
- 多種消息傳遞協議,如JMS和OpenMessaging
- 靈活的分布式橫向擴展部署架構
- Lightning-fast批處理消息交換系統
- 各種消息過濾器機制,如SQL和Tag
- Docker圖像用於隔離測試和雲隔離集群
- 功能豐富的管理儀表板,用於配置,指標和監控
- 訪問控制列表
- 消息跟蹤
上面都是官方列舉出來了,還有如下特點:
- 支持Broker和Consumer端消息過濾
- 支持拉pull和推push兩種消費模式,也就是上面說的推拉消費模式
- 支持單master節點,多master節點,多master節點多slave節點
- 消息失敗重試機制,支持特定level的定時消息
- 新版本底層采用Netty
官方網站: http://rocketmq.apache.org/docs/motivation/ 也對RocketMQ和ActiveMQ以及Kafka做了一個對比.
核心概念
參考: http://rocketmq.apache.org/docs/core-concept/ 本人英文閱讀能力有點弱,大家請看官方文檔.
- Producer: 消息生產者
- Producer Group: 消息生產者組,發送同類消息的一個消息生產組
- Consumer: 消息消費者
- Consumer Group: 消費同類消息的多個實例
- Tag: 標簽.子主題對topic的進一步細化,用於區分同一個主題下的不同業務的消息.
- Topic: 主題,queue是消息的物理管理單位,而topic是邏輯管理單位,一個topic下可以有多個queue,默認自動創建是4個,手動創建是8個.
- Message: 消息,每個Message必須指定一個topic
- Broker: MQ程序,接受生產的消息,提供給消費者消費的程序
- Name Server: 給生產和消費者提供路由信息,提供輕量級的服務發現、路由、元數據信息,可以多個部署,互相獨立(比zookeeper更輕量)
- Offset: 偏移量,可以理解為消息進度
- commit log: 消息存儲會寫在Commit log文件里面
雲服務器安裝RocketMQ
安裝RocketMQ
- 下載: http://rocketmq.apache.org/docs/quick-start/, 直接下載源代碼版本
- 上傳到雲服務器
- 開始操作(參考: http://rocketmq.apache.org/docs/quick-start/):
1. 安裝unzip命令: yum install unzip
2. 解壓: unzip rocketmq-all-4.4.0-source-release.zip
3. 重命名: mv rocketmq-all-4.4.0 rocketmq
4. 進入文件夾: cd rocketmq
5. 使用maven進行源碼編譯: mvn -Prelease-all -DskipTests clean install -U
6. 進入文件夾: cd distribution/target/apache-rocketmq
7. 啟動服務: sh bin/mqnamesrv (注意如果內存小於4G可能會失敗)
- 啟動失敗的原因與解決:
- 啟動失敗的原因與解決:
[root@iZwz94sw188z3yfl7lpmmsZ apache-rocketmq]# sh bin/mqnamesrv
Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew
young collector with the CMS collector is deprecated and will
likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning:
UseCMSCompactAtFullCollection is deprecated and will likely be
removed in a future release.
Java HotSpot(TM) 64-Bit Server VM warning: INFO:
os::commit_memory(0x00000006ec800000, 2147483648, 0) failed;
error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment
to continue.
# Native memory allocation (mmap) failed to map 2147483648 bytes
for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/software/rocketmq-all-
4.4.0/distribution/target/apache-rocketmq/hs_err_pid8993.log
這種原因是內存不足導致的,默認是4G,解決辦法是編輯 bin/runserver.sh:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
- 以守護進程的方式啟動:
nohup sh bin/mqnamesrv & 這個命令可能會nohup: ignoring input and appending output to ‘nohup.out’,如果出現這個,執行:
tail -f nohup.out
這個時候ctrl+c就不會退出程序,僅僅是讓程序后台運行
- 啟動Broker
[root@wangzhi apache-rocketmq]# sh bin/mqbroker -n localhost:9876
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/software/rocketmq/distribution/target/apache-rocketmq/hs_err_pid3012.log
出現了Broker內存不足的問題:
vim bin/runbroker.sh 修改 JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" 的內容為:
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"
完成之后以守護進程的方式進行啟動:
nohup sh bin/mqbroker -n localhost:9876 &
tail -f nohup.out
這個時候可以使用jps查看進程,並且可以根據進程號來kill進程
- 進行測試:
export NAMESRV_ADDR=localhost:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
- 遠程連接需要開發9876和10911端口,在生產環境不要開放
源碼安裝RcoketMQ4.X控制台
- 上傳源碼包
- 解壓: unzip rocketmq-externals-master.zip
- 進入文件夾: cd rocketmq-externals-master
- 開始操作:
先修改兩個BUG,一個是修改pom.xml的版本號.
cd rocketmq-console/
vim pom.xml : 將里面的rocketmq的版本號后面的snashop刪掉,只留個4.4.0就好
在上一個console的路徑下繼續:
cd src/main/resources/
vim application.properties : 修改nameserver地址 rocketmq.config.namesrvAddr=127.0.0.1:9876
返回到console目錄,進行編譯安裝:
mvn clean package -Dmaven.test.skip
- 啟動:
cd target
java -jar rocketmq-console-ng-1.0.0.jar
使用ctrl + c關閉程序,以守護進程的方式進行啟動
nohup java -jar rocketmq-console-ng-1.0.0.jar &
tail -f nohup.out