天天看點

RocketMQ介紹及Linux環境搭建

作者:馬士兵教育CTO
RocketMQ介紹及Linux環境搭建

一、RocketMQ介紹

RocketMQ是阿裡巴巴開源的一個消息中間件,在阿裡内部曆經了雙十一等很多高并發場景的考驗,能夠處理億萬級别的消息。2016年開源後捐贈給Apache,現在是Apache的一個頂級項目。

​ 目前RocketMQ在阿裡雲上有一個購買即可用的商業版本,商業版本內建了阿裡内部一些更深層次的功能及運維定制。我們這裡學習的是Apache的開源版本。開源版本相對于阿裡雲上的商業版本,功能上略有缺失,但是大體上功能是一樣的。

1.1、RocketMQ的發展曆程

​ 早期阿裡使用ActiveMQ,但是,當消息開始逐漸增多後,ActiveMQ的IO性能很快達到了瓶頸。于是,阿裡開始關注Kafka。但是Kafka是針對日志收集場景設計的,他的并發性能并不是很理想。尤其當他的Topic過多時,由于Partition檔案也會過多,會嚴重影響IO性能。于是阿裡才決定自研中間件,最早叫做MetaQ,後來改名成為RocketMQ。最早他所希望解決的最大問題就是多Topic下的IO性能壓力。但是産品在阿裡内部的不斷改進,RocketMQ開始展現出一些不一樣的優勢。

1.2、RocketMQ産品特點比較

​ RocketMQ的消息吞吐量雖然依然不如Kafka,但是卻比RabbitMQ高很多。在阿裡内部,RocketMQ叢集每天處理的請求數超過5萬億次,支援的核心應用超過3000個。

​ RocketMQ天生就為金融網際網路而生,是以他的消息可靠性相比Kafka也有了很大的提升,而消息吞吐量相比RabbitMQ也有很大的提升。另外,RocketMQ的進階功能也越來越全面,廣播消費、延遲隊列、死信隊列等等進階功能一應俱全,甚至某些業務功能比如事務消息,已經呈現出領先潮流的趨勢。

​ RocketMQ的源碼是用Java開發的,這也使得很多網際網路公司可以根據自己的業務需求做深度定制。而RocketMQ經過阿裡雙十一多次考驗,源碼的穩定性是值得信賴的,這使得功能定制有一個非常高的起點。

​ 傳統意義上,RocketMQ有一個比較大的局限,就是他的用戶端隻支援Java語言。但RocketMQ作為一個開源軟體,自身産品不斷成熟的同時,周邊的技術生态也需要不斷演進。RocketMQ成為Apache頂級項目後,又繼續通過社群開發出了很多與主流技術生态融合的周邊産品。例如在RocketMQ的社群,也正在開發GO,Python,Nodejs等語言的用戶端。下圖列出了RocketMQ社群目前的一些項目

RocketMQ介紹及Linux環境搭建

二、RocketMQ快速實戰

​ RocketMQ的官網位址: rocketmq.apache.org ,github位址是 github.com/apache/rock… ,目前最新的版本是5.1.0。我們這次采用4.9.1版本來進行示範

2.1、下載下傳RocketMQ

​ 最新版本的RocketMQ可以到官網上進行下載下傳。曆史版本需要到Github倉庫中下載下傳。下載下傳位址:github.com/apache/rock…

也可以在官網進行下載下傳

2.2、快速安裝RocketMQ

​ RocketMQ的安裝非常簡單,就是上傳解壓就可以了。

​ 安裝RocketMQ之前需要先安裝JDK,JDK自行安裝好則進行下一步

将下載下傳的rocketmq-all-4.9.1-bin-release.zip上傳到/usr/local/soft/目錄并完成解壓。完成後,把rocketmq的bin目錄也配置到環境變量當中。 vim /etc/profile,加入以下内容,并執行source vim /etc/profile讓環境變量生效:

#rocketmq環境變量 
export ROCKETMQ_HOME=/usr/local/soft/rocketmq 
PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin           

這樣RocketMQ就安裝完成了。我們把他運作起來。

這個ROCKETMQ_HOME的環境變量是必須要單獨配置的,如果不配置的話,啟動NameSever和Broker都會報錯。

這個環境變量的作用是用來加載$ROCKETMQ_HOME/conf下的除broker.conf以外的幾個配置檔案。是以實際情況中,可以不按這個配置,但是一定要能找到配置檔案。

2.3、 快速運作RocketMQ

2.3.1 RocketMQ工作原理

​ 運作之前,我們需要對RocketMQ的元件結構有個大緻的了解。

RocketMQ介紹及Linux環境搭建

RocketMQ由以下這幾個元件組成

  • NameServer : 提供輕量級的Broker路由服務(作為服務注冊,多個服務之間是互相隔離的,沒有任何資料互動)。
  • Broker:實際處理消息存儲、轉發等服務的核心元件(會将服務注冊到NameServer中,分為Master和Slave節點,Master作為資料的讀寫,Slave作為資料備份)。
  • Producer:消息生産者叢集。通常是業務系統中的一個功能子產品。
  • Consumer:消息消費者叢集。通常也是業務系統中的一個功能子產品。

是以我們要啟動RocketMQ服務,需要先啟動NameServer,然後再啟動Broker。

大概的工作原理是:

首先将NameServer服務啟動起來作為服務注冊,然後再将Broker服務啟動,Broker服務會注冊到NameServer中,這樣Producer啟動的時候會和NameServer進行連接配接,獲得在NameServer注冊的Broker,然後Producer再将消息發送到Broker中。

2.3.2 NameServer服務搭建

​ 啟動NameServer非常簡單, 在$ROCKETMQ_HOME/bin目錄下有個mqadminsrv。直接執行這個腳本就可以啟動RocketMQ的NameServer服務。

​ 但是要注意,RocketMQ預設預設的JVM記憶體是4G,這是RocketMQ給我們的最佳配置。但是通常我們用虛拟機的話都是不夠4G記憶體的,是以需要調整下JVM記憶體大小。修改的方式是直接修改runserver.sh。 用vi runserver.sh編輯這個腳本,在腳本中找到這一行調整記憶體大小為512m

RocketMQ介紹及Linux環境搭建

然後我們用靜默啟動的方式啟動NameServer服務:

nohup mqnamesrv &           

啟動完成後,在nohup.out裡看到這一條關鍵日志就是啟動成功了。并且使用jps指令可以看到有一個NamesrvStartup程序

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. 
The Name Server boot success. serializeType=JSON           
RocketMQ介紹及Linux環境搭建

2.3.3 Broker服務搭建

​ 啟動Broker的腳本是runbroker.sh。Broker的預設預設記憶體是8G,啟動前,如果記憶體不夠,同樣需要調整下JVM記憶體。vi runbroker.sh,找到這一行,進行記憶體調整,我這邊設定512m

RocketMQ介紹及Linux環境搭建

然後我們需要找到$ROCKETMQ_HOME/conf/broker.conf, vi指令進行編輯,在最下面加入一個配置(設定自動建立Topic):

autoCreateTopicEnable=true           

​ 然後也以靜默啟動的方式啟動runbroker.sh

nohup mqbroker &           

啟動完成後,同樣是檢查nohup.out日志,有這一條關鍵日志就辨別啟動成功了。 并且jps指令可以看到一個BrokerStartup程序。

The broker[Jony1, 192.168.253.131:10911] boot success. serializeType=JSON           

在觀察runserver.sh和runbroker.sh時,我們還可以檢視到其他的JVM執行參數,這些參數都可以進行定制。例如我們觀察到一個比較有意思的地方,nameServer使用的是CMS垃圾回收器,而Broker使用的是G1垃圾回收器。

2.3.4 指令行啟動用戶端實作消息的收發

在RocketMQ的安裝包中,提供了一個tools.sh工具可以用來在指令行快速驗證RocketMQ服務,通過調用tools.sh 就可以實作測試消息收發

首先需要配置一個環境變量NAMESRV_ADDR指向我們啟動的NameServer服務。

RocketMQ介紹及Linux環境搭建

啟動消息生産者發送消息,預設會發1000條消息

bin/tools.sh org.apache.rocketmq.example.quickstart.Producer           
RocketMQ介紹及Linux環境搭建

這日志中,上面部分就是我們發送的消息的内容。後面兩句辨別消息生産者正常關閉。

然後啟動消息消費者接收消息:

bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer           

啟動後,可以看到消費到的消息。

RocketMQ介紹及Linux環境搭建
日志中MessageExt後的整個内容就是一條完整的RocketMQ消息。我們要對這個消息的結構有個大概的了解,後面會對這個消息進行深入的了解。其中比較關鍵的屬性有:brokerName,queueId,msgId,topic,cluster,tags,body,transactionId。先找下這些屬性在哪裡。

而這個Consume指令并不會結束,他會繼續挂起,等待消費其他的消息。我們可以使用CTRL+C停止該程序。

2.3.5 關閉RocketMQ服務

要關閉RocketMQ服務可以通過mqshutdown腳本直接關閉

# 1.關閉NameServer

sh bin/mqshutdown namesrv

# 2.關閉Broker

sh bin/mqshutdown broker