RocketMq(一)初識

茶底世界發表於2021-04-20

訊息中介軟體基本上是網際網路公司必用的一箇中介軟體,為什麼要使用MQ,當然是因為能給我們的系統帶來很多好處。

訊息佇列簡單來說是一種先進先出的資料結構,先簡單認識下。

一、應用場景

訊息中介軟體主要應用場景主要三個方面是:非同步、解耦、削峰

非同步

非同步比較好理解,很多公司其實本身系統的併發量還是訪問量不一定會很大,但是業務會很複雜,一個動作會牽扯到很多業務,當使用者觸發某個事件後,後面可能有N個步驟,這些步驟如果都需要一個一個序列去走完,那麼使用者等待的時間就會非常長,這樣,即使系統的使用人數不多,也是不能接受的。

這個時候我們使用訊息中介軟體去做非同步處理就很好理解了,當有一個長鏈條操作時,我們將這個長鏈條進行拆分,使用非同步去處理,舉個最常見的例子吧。

使用者下單,我們簡單可想的後續操作就有很多,如扣除優惠券,增加積分,訊息提醒等等,這些操作在客戶下單的時候,他不需要馬上得到這些結果,我們完全可以進行非同步操作。

當然,有人說,這個不是可以用多執行緒去操作麼?其實這個就引出了下一個應用場景

解耦

在程式設計過程中,有一條原則是大家耳熟能詳的,高內聚、低耦合,如剛剛說的,雖然用多執行緒,可以進行非同步,但是畢竟是一個流程中去呼叫,這樣系統必定耦合度會比較高,耦合度太高,容錯性就低,如上,其中一個系統出錯,就會導致整個系統出錯,而且如果又要增加業務,那整個系統需要重新發布,而且也需要再進行測試。

訊息中介軟體怎麼進行解耦呢?主系統下單完成後,寫入訊息,其他的系統只要按照需要進行消費即可,這樣其他系統出錯了也不會影響主業務,也很方便的去增加或減少業務,只要增加消費或去掉消費即可。

削峰

削峰用最常見的秒殺來就很好理解,秒殺會使短時間內使系統面臨巨大流量,而平時系統的伺服器硬體不需要配置這麼高,那我們其他的服務,特別是資料庫這些,很容易就被打掛了,這個時候我們使用訊息,將訪問請求都放到佇列中,讓業務分散到長時間去處理請求,這樣雖然暫時會使得系統變得慢一些,但不會使整個系統直接崩潰。

二、帶來的問題

當然,很多事情都有兩面性,只有好處沒有壞處的事情是很少的,那我們來想想訊息會帶來哪些問題。

系統可用性降低

這個很好理解,既然引用了MQ,那就存在MQ當機的情況,這必然就會造成業務影響,這裡就要考慮MQ的高可用。

系統複雜度

新增一個元件,必然會帶來系統的複雜度,當我們引用一個元件,就要想到它可能帶來的問題。加上MQ後,既然是非同步呼叫,那就要考慮訊息有沒有被重複消費,訊息有可能丟失,還有訊息的傳遞順序。

一致性問題

分散式服務本身都會存在這個問題,A系統處理完業務,通過MQ分傳送訊息,那每個系統處理,都會有自己的狀態,A成功了,B失敗了,這樣必然就有資料一致性問題。

三、各MQ的比較

目前在市面上比較主流的訊息佇列中介軟體主要有,Kafka、ActiveMQ、RabbitMQ、RocketMQ 等這幾種。我們可以做個比較。

特性ActiveMQRabbitMQRocketMQKafka
開發語言 java erlang java scala
單機吞吐量 萬級 萬級 10萬級 10萬級
時效性 ms級 us級 ms級 ms級
可用性 高(主從架構) 高(主從結構) 非常高(分散式架構) 非常高(分散式架構)
訊息可靠性 有較低概率丟失資料 基本不丟 經過引數優化,可以做到0丟失 經過引數優化,可以做到0丟失
功能支援 MQ領域的功能極其完備 併發效能強,效能很好,延時低 MQ功能較為完善,分散式,擴充套件性好 功能較為簡單,主要支援簡單的MQ功能

ActiveMQ 使用比較少了,RabbitMQ語言不是java,這點很要命, Kafka很好用,一般大資料領域使用的非常多,一般規模的話使用RocketMQ,畢竟阿里出品的,生態方面都比較穩。

四、快速入門

理論太多,容易勸退,先跑起來再說。

下載原始碼

下載二進位制檔案即可,需要看原始碼再下載原始碼:https://rocketmq.apache.org/dowloading/releases/ 

上傳到伺服器,工作之後還是建議買一臺自己的伺服器,個人伺服器還是很便宜的。

unzip rocketmq-all-4.8.0-bin-release.zip

如果沒有安裝解壓工具,則安裝:

 yum install -y unzip zip 

可以修改下解壓包名稱

mv rocketmq-all-4.8.0-bin-release rocketmq

啟動RocketMq

4.1 啟動NameServer,以下命令都在bin目錄下

# 啟動命令,並且常駐記憶體,nohup 屬於後臺啟動,當前目錄下生成 nohup.out 日誌檔案,也可以指定日誌輸出位置。
$ nohup sh mqnamesrv &
# 可以直接啟動專案
$ sh mqnamesrv :
# 檢視啟動日誌,能看到 "The Name Server boot success" 字樣則成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log

 如果顯示沒有日誌檔案目錄,那說明沒有啟動成功,是因為預設的初始化記憶體8G,記憶體不足導致的

vi  runserver.sh 
vi  runbroker.sh

找到設定記憶體的位置,改成256m即可

4.2 啟動 Broker 中介軟體

# 啟動命令,並且常駐記憶體,nohup 屬於後臺啟動,當前目錄下生成 nohup.out 日誌檔案,也可以指定日誌輸出位置。
nohup sh mqbroker -n localhost:9876 &
# 直接啟動
sh mqbroker -n localhost:9876 :
# 檢視啟動日誌
tail -f ~/logs/rocketmqlogs/broker.log

4.3 測試傳送訊息

開啟兩個tab進行命令執行,可以更加直觀的檢視

測試生產訊息

 export NAMESRV_ADDR=localhost:9876 
 sh tools.sh org.apache.rocketmq.example.quickstart.Producer

結果如下:

 測試消費者

 export NAMESRV_ADDR=localhost:9876 
 sh tools.sh  org.apache.rocketmq.example.quickstart.Consumer 

結果:

4.4 關閉mq

與啟動順序相反進行關閉,先關閉 broker、在關閉 nameserv

sh mqshutdown broker
sh mqshutdown namesrv   

以上就是啟動mq的流程,其實還是挺簡單的,下面再介紹下幾個概念,後面再進行下深入學習。

五、角色介紹

幾個基礎概念

 

 

名字服務(Name Server):名稱服務充當路由訊息的提供者。生產者或消費者能夠通過名字服務查詢各主題相應的Broker IP列表。多個Namesrv例項組成叢集,但相互獨立,沒有資訊交換。

代理伺服器(Broker Server):訊息中轉角色,負責儲存訊息、轉發訊息。代理伺服器在RocketMQ系統中負責接收從生產者傳送來的訊息並儲存、同時為消費者的拉取請求作準備。代理伺服器也儲存訊息相關的後設資料,包括消費者組、消費進度偏移和主題和佇列訊息等。

訊息生產者(Producer):負責生產訊息,一般由業務系統負責生產訊息。一個訊息生產者會把業務應用系統裡產生的訊息傳送到broker伺服器。RocketMQ提供多種傳送方式,同步傳送、非同步傳送、順序傳送、單向傳送。同步和非同步方式均需要Broker返回確認資訊,單向傳送不需要。

訊息消費者(Consumer):負責消費訊息,一般是後臺系統負責非同步消費。一個訊息消費者會從Broker伺服器拉取訊息、並將其提供給應用程式。從使用者應用的角度而言提供了兩種消費形式:拉取式消費、推動式消費。

主題(Topic):表示一類訊息的集合,每個主題包含若干條訊息,每條訊息只能屬於一個主題,是RocketMQ進行訊息訂閱的基本單位。