RocketMQ原理解析之服務安裝啓動
一、RocketMQ簡介
阿里的消息中間件有很長的歷史,從2007 年的Notify 到2010 年的Napoli,2011 年升級後改爲MetaQ ,然後到2012 年開始做RocketMQ, RocketMQ 使用Java 語言開發,於2016 年開源。第一代的Notify 主要使用了推模型(push),解決了事務消息;第二代的MetaQ 主要使用了拉模型(pull),解決了順序消息和海量堆積的問題。RocketMQ 基於長輪詢的拉取方式, 兼有兩者的優點。
消息隊列是基於“先進先出(FIFO)” 的一種數據結構, 隨着互聯網的發展,“微架構” 的模式不段興起, 這些微服務可以再同一個局域網內,也可以跨機房部署,這使得服務之間鬆耦合要求越來越高, 並且服務之間的聯繫越來越緊密。這對通信質量要求越來越高, 對消息隊列也有了更高的要求。
二、消息隊列提供的功能
2.1 應用解耦
複雜的應用裏會存在多個子系統, 比如:電商系統中有 會員中心、用戶中心、交易中心、支付中心、營銷中心、庫存中心、物流中心、通用中心等。傳統的開發是前面的各個中心放在一個應用中, 這使得各個子系統之間的耦合性太高了,整個系統的可用性比較低, 即使各個子模塊是低錯誤率系統,但是整合到一起可能會是一個高錯誤率的系統。
舉例: 以電商系統爲例,用戶在創建訂單後,如果耦合調用庫存系統,物流系統,支付系統,當其中一個子系統出現問題或者進行升級,都會造成整個下單流程失敗, 嚴重影響用戶的體驗。
如果系統之間的調用通過消息隊列,系統的可用性會提高很多, 還是參照上面的例子, 如果物流系統出現BUG或者在進行升級, 可以將消息緩存在消息隊列中, 在服務可以正常使用時再進行後續處理,保證這個服務再宏觀上時可用的,終端客戶也不會感受到故障的發生。
可以參照下面的圖進行比較:
2.2 流量削峯
在高併發的場景下,大部分應用系統的流量會達到峯值,如果沒有緩存機制,不可能承受住短時間內大流量衝擊,如果利用消息隊列,將消息請求暫存起來,分散到較長的時間來處理,能很大程度提高系統穩定性和用戶體驗。
比如: 訂單系統處理能力是5000次/s,如果在秒殺、其它高併發場景, 當請求處理超過5000, 只能拒絕之後的請求,如果將請求暫存在消息隊列中,分散在較長的一段時間來處理,比如十幾秒之後客戶收到訂單成功消息,這個是可以接受的,相較與下單失敗,有很高的用戶體驗。
2.3 消息併發
在整個應用系統中,數據是不斷產生的,數據產生方只需要將各自的數據協議消息隊列,數據使用方只需要訂閱自己感興趣的消息即可,不同模塊之間互不干擾, 不需要和數據產生方有關聯。
可以通過下面的圖示進行理解:
除了上面提到的功能, RocketMQ還具有 最終一致性、方便動態擴容 功能,後期再進行補充。
三、RocketMQ服務安裝
3.1 單機版RockMQ安裝
RocketMQ安裝存在兩種方式(本文只介紹第一種)
- Binary版, 一些編譯好的jar和輔助shell腳本
- Source版, RocketMQ源碼, 需要自己通過maven編譯
下圖是官網(http://rocketmq.apache.org/dowloading/releases/)給的下載文件
- 推薦系統: 64bit OS, Linux/Unix/Mac
- JDK: 64bit JDK 1.8+
- Maven 3.2.x
- Git
注: 其中maven 、git是針對源碼安裝的
3.1.1 下載文件
> wget -c http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
3.1.2 解壓文件
> unzip rocketmq-all-4.2.0-bin-release.zip -d ./rocketmq-all-4.2.0-bin
> cd rocketmq-all-4.2.0-bin
RocketMQ的目錄結構如下(下面是Win10中的視圖, 不是Linux中的視圖, 但是文件的內容一樣):
- benchmark 裏包括運行benchmark 程序的shell 腳本
- bin , 文件夾中包含RocketMQ使用的各種shell腳本(Linux平臺) 和 cmd腳本(win平臺), 比如: mqnamesrv(啓動nameserver), mqbroker(啓動Broker)
- conf, 裏面有一些示例配置文件, 參考下面圖示
- lib 文件夾裏包括RocketMQ各個模塊編譯成的jar 包,以及RocketMQ 依賴的一些jar 包,比如Netty 、commons - lang 、FastJSON 等
- LICENSE 、NOTICE 和README.md 包括一些版權聲明和功能說明信息
3.1.3 啓動消息隊列服務
- 啓動NameServer
> nohup sh bin/mqnamesrv &
- 啓動broker
> nohup sh bin/mqbroker -n localhost:9876 &
3.1.4 命令行發送接收消息
- 啓動生產者
> export NAMESRV ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
輸出內容:
SendResult [sendStatus=SEND OK, msgid=
- 啓動消費者
>sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
輸出內容:
ConsumeMessageThread_%d Receive New Messages: [MessageExt . …
3.1.5 關閉消息隊列
消息隊列被啓動後, 如果不主動關閉,會一直在後臺運行,佔用系統資源。
- 關閉broker
> sh bin/mqshutdown broker
- 關閉namesrv
> sh bin/mqshutdown namesrv
經過上面的操作流程, 一個簡單的RocketMQ已經安裝好了。