消息中間件之RocketMQ簡介(系列一)

什麼是消息中間件

消息(Message)是指在應用間傳送的數據。消息可以非常簡單,比如至包含文本字符串、JSON等,當然了,也可以很複雜,比如內嵌對象。

消息隊列中間件(Message Queue Middleware,簡稱 MQ)是指利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分佈式環境下擴展進程間的通信。

目前開源的消息中間件有很多,比較主流的有RabbitMQ、KafkaActiveMQ、RocketMQ

消息中間件的分類

  • 消息模型(PUSH)

    消息生產者將消息發送給消息傳遞服務,消息傳遞服務又消息推給消息消費者。

  • 拉消息模型(PULL)

 消費者請求消息服務請求消息,消息生產者從消息中間件拉消息。

兩者的區別:

模型

push

pull

服務端

消息存儲

處理請求

保存推送軌跡

保存訂閱關係

消費者負載均衡

集中式

消息存儲

處理請求

分佈式

客戶端

處理響應和請求

處理響應和請求

保存pull狀態,如拉取位置的偏移量offset

異常情況下的消息暫存

實時性

較好,收到數據後可立即發送給客戶端

取決於pull的時間間隔

消費者故障

消費者故障情況下,服務堆積消息,重複推送耗費資源

保存推送軌跡壓力很大

消費者故障,對服務端影響

其他

對消息推送有更多控制,能實現多樣化的推送機制,當消費者數量增多時候,推送壓力大,性能天花板,消費者處理能力差異,導致堆積消息

需要在客戶端實現消息過濾,浪費資源

需要在不同客戶端之間協調,做負載均衡

消息中間件的應用場景

l可恢復性

譬如跨機房數據複製

l異步通信

用戶註冊發郵件和短信

l流量削峯

諸如大促、秒殺活動等

另也可用於性能壓測

l順序保證

比如在支付系統中,處理順序就很重要

l解耦

例如:電商系統中用戶下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的接口;這時若訂單系統故障,則庫存系統就會失敗,從而導致訂單失敗,同時也出現耦合度高,使用消息中間件;下單系統和庫存系統可以單獨分開設計,做到應用解耦。

l日誌收集

計算PV、用戶行爲分析

RocketMQ簡介

阿里的消息中間有很長的歷史,從2007年的notify2010年的Napoli2011年升級後改爲MetaQ,然後到2012年開始做RocketMQRocketMQ使用Java語言開發,於2016年開源。第一代的Notify主要使用了推模型,解決了事務消息;第二代的MetaQ主要使用了拉模型,解決了順序消息和海量堆積的問題。RocketMQ基於長輪詢的拉取方式,兼有兩者的優點。

目前RocketMQ已經成爲Apache頂級項目。在阿里內部,RocketMQ很好地服務了集團大大小小上千個應用,在每年的雙11當天,有萬億級消息通過RocketMQ流轉(在2017年雙11當天,RocketMQ流轉的線上消息達到了萬億級,峯值TPS達到5600萬),在阿里大中臺上也發揮了一定的作用。

RocketMQ的特點

l是一個隊列模型的消息中間件,具有高性能、高可靠、高實時、分佈式特點

lProducerConsumer、隊列都可以分佈式

l能夠保證嚴格的消息順序

l提供豐富的消息拉取模式

l高效的訂閱者水平擴展能力

l實時的消息訂閱機制

l億級消息堆積能力

l較少的依賴

RocketMQ物理部署結構

image.png

如上圖所示, RocketMQ的部署結構有以下特點:

lName Server是一個幾乎無狀態節點,可集羣部署,節點之間無任何信息同步。

lBroker部署相對複雜,Broker分爲Master與Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master,Master與Slave的對應關係通過指定相同的BrokerName,不同的BrokerId來定義,BrokerId爲0表示Master,非0表示Slave。Master也可以部署多個。每個Broker與Name Server集羣中的所有節點建立長連接,定時註冊Topic信息到所有Name Server。

lProducer與Name Server集羣中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer完全無狀態,可集羣部署。

lConsumer與Name Server集羣中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。

RocketMQ邏輯部署結構

image.png

如上圖所示,RocketMQ的邏輯部署結構有Producer和Consumer兩個特點。

Producer Group

用來表示一個發送消息應用,一個Producer Group下包含多個Producer實例,可以是多臺機器,也可以是一臺機器的多個進程,或者一個進程的多個Producer對象。一個Producer Group可以發送多個Topic消息,Producer Group作用如下:

1. 標識一類Producer

2. 可以通過運維工具查詢這個發送消息應用下有多個Producer實例

3. 發送分佈式事務消息時,如果Producer中途意外宕機,Broker會主動回調Producer Group內的任意一臺機器來確認事務狀態。

Consumer Group

用來表示一個消費消息應用,一個Consumer Group下包含多個Consumer實例,可以是多臺機器,也可以是多個進程,或者是一個進程的多個Consumer對象。一個Consumer Group下的多個Consumer以均攤方式消費消息,如果設置爲廣播方式,那麼這個Consumer Group下的每個實例都消費全量數據。

常用RocketMQ集羣模式

nmaster模式

也就是隻有一個master節點,稱不上是集羣,一旦這個master節點宕機,那麼整個服務就不可用,適合個人學習使用。

nMaster模式

多個master節點組成集羣,單個master節點宕機或者重啓對應用沒有影響。

優點所有模式中性能最高

缺點單個master節點宕機期間,未被消費的消息在節點恢復之前不可用,消息的實時性就受到影響。

注意:使用同步刷盤可以保證消息不丟失,同時Topic相對應的queue應該分佈在集羣中各個節點,而不是隻在某各節點上,否則,該節點宕機會對訂閱該topic的應用造成影響。

nMasterslave異步複製模式

在多master模式的基礎上,每個master節點都有至少一個對應的slavemaster

節點可讀可寫,但是slave只能讀不能寫,類似於mysql的主備模式。

優點master宕機時,消費者可以從slave讀取消息,消息的實時性不會受影響,性能幾乎和多master一樣。

缺點使用異步複製的同步方式有可能會有消息丟失的問題。

nMasterSlave同步複製雙寫模式

同多 masterslave異步複製模式類似,區別在於masterslave之間的數據同步方式。

【優點】同步雙寫的同步模式能保證數據不丟失。

【缺點】發送單個消息RT會略長,性能相比異步複製低10%左右。

【刷盤策略】同步刷盤和異步刷盤(指的是節點自身數據是同步還是異步存儲)

【同步方式】同步雙寫和異步複製(指的一組masterslave之間數據的同步)

注意:要保證數據可靠,需採用同步刷盤和同步雙寫的方式,但性能會較其他方式低

集羣模式總結

MasterSlave(脆弱)

masterSlave(單點故障就癱瘓,開源版本無主備切換功能)

MasterSlave(無單點故障,prod環境常用)

MasterSlave(無單點故障)




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