前言
最近挺忙的,好久沒更新文章了,最近在搞RocketMQ,那就先發點這個,Netty的文章等我空了再繼續更,
一.MQ概述
1.MQ是什么
MQ全稱為Message Queue,即訊息佇列 ,是一種提供訊息佇列服務的中間件,也稱為訊息中間件,是一套提供了訊息生 產、存盤、消費全程序的軟體系統,遵循FIFO原則,在高并發的分布式系統中使用居多,
2.為什么用MQ
為什么要使用MQ, 我從生活中發現的一個例子來舉例說明,即:天府通刷地鐵出站的時候不是立馬扣費,而是提示“出站成功,費用將會在稍后結算”, 我們假設天府通后臺扣費流程如下:

【注意】假如天府通出站API 和 支付系統 是不同的子系統 (兩個子系統遠程通信)
上下班高峰期使用天府通刷碼的人非常多,意味著并發量很高,一個出站請求到后臺需要做費用結算,或者積分贈送等業務,由于并發很高,并且費用結算和積分等業務本來就耗時,況且支付服務也不一定能承擔那么大的請求量,
當服務器執行緒耗盡,后續請求會等待變慢,再加上高并發請求就會導致后續請求越來越慢,請求長時間等待,導致大量請求超時,并發太高,可能會導致服務器的記憶體上升,CPU使用率急速上升,甚至導致服務器宕掉,
解決方案:使用MQ消峰,讓請求在MQ中排隊,效果如下

加入MQ后的效果
- 高并發請求在MQ中排隊,達到了消除峰值的目的,不會有大量的請求同時懟到支付系統
- 服務異步呼叫,“天府通出站API” 把結算訊息放入MQ就可以回傳“出站成功,費用稍后結算”給用戶,回應時間很快
- 服務徹底解耦,即使支付服務掛掉,也不影響“天府通出站API”正常作業,當支付系統再啟動仍然可以繼續消費MQ中的訊息,
3.MQ的使用場景
-
限流削峰
MQ可以將系統的超量請求暫存其中,以便系統后期可以慢慢進行處理,從而避免了請求的丟失或系統 被壓垮,
-
服務解耦
上游系統對下游系統的呼叫若為同步呼叫,則會大大降低系統的吞吐量與并發度,且系統耦合度太高, 而異步呼叫則會解決這些問題,所以兩層之間若要實作由同步到異步的轉化,一般性做法就是,在這兩層間添加一個MQ層, 即使消費者掛掉也不影響生產者作業,只要把訊息放入佇列即可,消費者重啟后自己消費即可,
-
資料收集
通過MQ實作資料的收集,如:業務日志、監控資料、用戶行為等
-
大資料處理
比如我們的平臺向“三方平臺”獲取資料,一次請求了大量資料回來要進行處理,由于資料較多處理不過來,那么就可以放入MQ,再創建一些消費者進行資料處理即可,
4.常見的MQ產品
- ActiveMQ
ActiveMQ是使用Java語言開發一款MQ產品,早期很多公司與專案中都在使用,但現在的社區活躍度已經很低,現在的專案中已經很少使用了, - RabbitMQ
RabbitMQ是使用ErLang語言開發的一款MQ產品,性能還是挺高的,但是其吞吐量較Kafka與RocketMQ要低,且由于其不是 Java語言開發,所以公司內部對其實作定制化開發難度較大, - Kafka
Kafka是使用Scala/Java語言開發的一款MQ產品,其最大的特點就是高吞吐率,常用于大資料領域的實 時計算、日志采集等場景,其沒有遵循任何常見的MQ協議,而是使用自研協議,對于Spring Cloud Net? ix,其僅支持RabbitMQ與Kafka, - RocketMQ
RocketMQ是使用Java語言開發的一款MQ產品,經過數年阿里雙11的考驗,性能與穩定性非常高,其 沒有遵循任何常見的MQ協議,而是使用自研協議,
【PS】偷來的圖O(∩_∩)O哈哈~

技術選型建議:
- 大資料場景,日志收集,實時性要求高,推薦Kafka
- 金融領域,不能接受訊息丟失或重復,推薦使用RocketMQ
- 其他情況可以選擇RabbitMQ
一.RocketMQ認識與安裝
1.RocketMQ是什么
RocketMQ是一個統一訊息引擎、輕量級資料處理平臺, RocketMQ是?款阿?巴巴開源的訊息中間件,雙十一承載了萬億級訊息的流轉,2016年11?,阿?巴巴向 Apache 軟體基?會捐贈 RocketMQ,成為 Apache 范訓項?,2017 年 9 ? ,Apache 宣布 RocketMQ范訓成為 Apache 頂級項?(TLP )成為國內?個互聯?中間件在 Apache 上的頂級項?,官網:https://github.com/apache/rocketmq/tree/master/docs/cn
2.RocketMQ的特征
- 支持集群模型、負載均衡、水平擴展能力
- 億級別訊息堆積能力
- 采用零拷貝的原理,順序寫盤,隨機讀
- 底層通信框架采用Netty NIO
- 訊息失敗重試機制、訊息可查詢
- 強調集群無單點,可擴展,任意一點高可用,水平可擴展
- 經過多次雙十一的考驗
3.RocketMQ的安裝[windows]
3.1.下載RocketMQ
下載地址:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/

下載后解壓

- Bin : 可執行檔案目錄
- Conif:組態檔目錄
- Lib : 依賴庫,一堆Jar包
3.2.配置ROCKETMQ_HOME
解壓,配置 ROCKETMQ_HOME

3.3.啟動RocketMQ
-
啟動NameServer: Cmd命令框執行進入至‘MQ檔案夾\bin’下,然后執行
start mqnamesrv.cmd,啟動NameServer,

成功后會彈出提示框,此框勿關閉,

-
啟動Broker:進入至‘MQ檔案夾\bin’下,修改Bean目錄下的
runbroker.cmd中JVM占用記憶體大小

CMD執行start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true,啟動Broker,

成功后會彈出提示框,此框勿關閉

3.4.RocketMQ存盤結構[了解]
RabbitMQ安裝好之后會在用戶目錄下產生一個store目錄用來存盤相關資料:

- Commitlog : 訊息是存盤寫在commitlog目錄中,一mapperdFile檔案順序存盤訊息,
- Config : 存放運行期間的組態檔
- Consumerqueue : 該目錄中存放的是佇列,consume queue存放著commitlog中的訊息的索引位置
- Index :存放著訊息索引檔案 indexFile,用來實作根據key進行訊息的快速查詢
- Abort : 該檔案在broker啟動后自動創建,正常關閉abort會消失
- Checkpoint :記錄 Commitlog ,Consumerqueue 和index 檔案的最后刷盤時間戳
RocketMQ資料存盤在磁盤會影響性能嗎?不會,RocketMQ的性能在所有的MQ中是比較高的,主要是因為RocketMQ使用了mmap零拷貝技術,consumequeue中的資料是順序存放的,還引入了PageCache的預讀取機制,使得對 consumequeue檔案的讀取幾乎接近于記憶體讀取,即使在有訊息堆積情況下也不會影響性能,
3.5.RocketMQ管理插件
為了方便管理,我們需要安裝一個可視化插件
-
下載插件 :RocketMQ可視化管理插件下載地址:https://github.com/apache/rocketmq-externals/releases

-
修改配置 :解壓后,修改配置:src/main/resource/application.properties 如下: 這里需要指向Name Server 的地址和埠

-
打包插件 :回到安裝目錄,執行:
mvn clean package -Dmaven.test.skip=true,然后會在target目錄生成打包后的jar檔案

-
啟動插件:進入 target 目錄,執行
java -jar rocketmq-console-ng-1.0.0.jar, 訪問 http://localhost:8080

文章到這就結束了,點贊還是要求一下的,萬一螢屏面前的大帥哥,或者大漂亮一不小心就一鍵三連了啦,那我就是熬夜到頭發掉光,也出下章,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296524.html
標籤:其他
