RocketMQ原理解析之服務安裝啓動

一、RocketMQ簡介

    阿里的消息中間件有很長的歷史,從2007 年的Notify 到2010 年的Napoli,2011 年升級後改爲MetaQ ,然後到2012 年開始做RocketMQ, RocketMQ 使用Java 語言開發,於2016 年開源。第一代的Notify 主要使用了推模型(push),解決了事務消息;第二代的MetaQ 主要使用了拉模型(pull),解決了順序消息和海量堆積的問題。RocketMQ 基於長輪詢的拉取方式, 兼有兩者的優點。
    消息隊列是基於“先進先出(FIFO)” 的一種數據結構, 隨着互聯網的發展,“微架構” 的模式不段興起, 這些微服務可以再同一個局域網內,也可以跨機房部署,這使得服務之間鬆耦合要求越來越高, 並且服務之間的聯繫越來越緊密。這對通信質量要求越來越高, 對消息隊列也有了更高的要求。

二、消息隊列提供的功能

2.1 應用解耦

    複雜的應用裏會存在多個子系統, 比如:電商系統中有 會員中心、用戶中心、交易中心、支付中心、營銷中心、庫存中心、物流中心、通用中心等。傳統的開發是前面的各個中心放在一個應用中, 這使得各個子系統之間的耦合性太高了,整個系統的可用性比較低, 即使各個子模塊是低錯誤率系統,但是整合到一起可能會是一個高錯誤率的系統。
舉例: 以電商系統爲例,用戶在創建訂單後,如果耦合調用庫存系統,物流系統,支付系統,當其中一個子系統出現問題或者進行升級,都會造成整個下單流程失敗, 嚴重影響用戶的體驗。
    如果系統之間的調用通過消息隊列,系統的可用性會提高很多, 還是參照上面的例子, 如果物流系統出現BUG或者在進行升級, 可以將消息緩存在消息隊列中, 在服務可以正常使用時再進行後續處理,保證這個服務再宏觀上時可用的,終端客戶也不會感受到故障的發生。
    可以參照下面的圖進行比較:
RocketMQ 應用解耦

圖一、RocketMQ應用解耦

2.2 流量削峯

    在高併發的場景下,大部分應用系統的流量會達到峯值,如果沒有緩存機制,不可能承受住短時間內大流量衝擊,如果利用消息隊列,將消息請求暫存起來,分散到較長的時間來處理,能很大程度提高系統穩定性和用戶體驗。
    比如: 訂單系統處理能力是5000次/s,如果在秒殺、其它高併發場景, 當請求處理超過5000, 只能拒絕之後的請求,如果將請求暫存在消息隊列中,分散在較長的一段時間來處理,比如十幾秒之後客戶收到訂單成功消息,這個是可以接受的,相較與下單失敗,有很高的用戶體驗。

2.3 消息併發

    在整個應用系統中,數據是不斷產生的,數據產生方只需要將各自的數據協議消息隊列,數據使用方只需要訂閱自己感興趣的消息即可,不同模塊之間互不干擾, 不需要和數據產生方有關聯。
    可以通過下面的圖示進行理解:
消息隊列的消息分發功能

圖二、消息隊列的消息分發功能
    通過上面的圖示, 各個子系統將日誌數據不停地寫人消息隊列,不同的數據處理系統有各自的Offset ,互不影響。甚至某個團隊處理完的結果數據也可以寫人消息隊列,作爲數據的產生方,供其他團隊使用,避免重複計算。

    除了上面提到的功能, RocketMQ還具有 最終一致性、方便動態擴容 功能,後期再進行補充。

三、RocketMQ服務安裝

3.1 單機版RockMQ安裝

     RocketMQ安裝存在兩種方式(本文只介紹第一種)

  1. Binary版, 一些編譯好的jar和輔助shell腳本
  2. Source版, RocketMQ源碼, 需要自己通過maven編譯
    下圖是官網(http://rocketmq.apache.org/dowloading/releases/)給的下載文件
    RocketMQ安裝文件下載

     查看官方文檔, 系統要求如下:

  • 推薦系統: 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中的視圖, 但是文件的內容一樣):
RocketMQ Binary 包含的內容視圖

  • benchmark 裏包括運行benchmark 程序的shell 腳本
  • bin , 文件夾中包含RocketMQ使用的各種shell腳本(Linux平臺) 和 cmd腳本(win平臺), 比如: mqnamesrv(啓動nameserver), mqbroker(啓動Broker)
  • conf, 裏面有一些示例配置文件, 參考下面圖示
    RocketMQ 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已經安裝好了。

3.2 集羣版RocketMQ安裝(待補充)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章