消息中間件和AMQP

消息中間件也叫消息代理,是專門用來處理消息的代理組件,消息代理從消息生產(chǎn)者那里接收消息,然后按規(guī)則分發(fā)消息到消息隊(duì)列,消息消費(fèi)者從隊(duì)列獲取消息并確認(rèn)消息處理。

消息中間件隔離了消息生產(chǎn)者和消費(fèi)消費(fèi)者,使它們可以異步發(fā)送消息和接受消息。使用了消息中間件的軟件架構(gòu)我們稱為面向消息的架構(gòu)。

面向消息的架構(gòu)可以帶來一些顯著的好處:

  • 方便異構(gòu),生產(chǎn)者和消費(fèi)者可以用不同的技術(shù)手段實(shí)現(xiàn),只要遵從消息處理規(guī)則。所以有很好的靈活性和擴(kuò)展性。
  • 方便伸縮,可以同時(shí)有多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者并行工作,按消息處理能力可以自由配置生產(chǎn)者和消費(fèi)者的個(gè)數(shù),同時(shí)生產(chǎn)者和消費(fèi)者可以處于不同的節(jié)點(diǎn),是可分布的。
  • 彈性容錯(cuò)增強(qiáng),生產(chǎn)者和消費(fèi)者可以隨時(shí)加入或離開,不會影響整個(gè)系統(tǒng)的運(yùn)行。如果有某個(gè)消費(fèi)者出錯(cuò)的,只要重啟或交由其他節(jié)點(diǎn)即可,不會導(dǎo)致數(shù)據(jù)丟失。
  • 流量管理和批處理能力,消息隊(duì)列的引入帶來了一個(gè)消息緩沖區(qū),可以抵抗異常流量和提高處理效率。

當(dāng)然,引入消息中間件也會帶來一些問題,實(shí)現(xiàn)上也增加了難度,需要權(quán)衡考慮,比如會增加資源消耗,一些情況下會導(dǎo)致消息重復(fù)處理,消息排序也會帶來問題,處理代碼會冗余,還可能帶來數(shù)據(jù)不一致,還會帶來一定的延遲。

為了更好的使用消息中間件,需要一個(gè)消息處理模型,這就是被引入的AMQP模型 ,
AMQP模型對消息傳遞過程做了詳細(xì)的定義:發(fā)布者發(fā)布消息給交換機(jī)(注意:不是硬件交換機(jī)的概念),交換機(jī)依據(jù)綁定分發(fā)消息給隊(duì)列們,消費(fèi)者從對應(yīng)的隊(duì)列提取消息。

AMQP(Advanced Message Queuing Protocol)是一種消息隊(duì)列協(xié)議標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。 基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受客戶端/中間件不同產(chǎn)品,不同的開發(fā)語言等條件的限制。

在AMQP標(biāo)準(zhǔn)中,三個(gè)主要功能模塊(交換機(jī) exchange,消息隊(duì)列 message queue,綁定 binding)連接成一個(gè)處理鏈完成預(yù)期的功能:

  • “交換機(jī)(exchange)”接收發(fā)布應(yīng)用程序發(fā)送的消息,并根據(jù)一定的規(guī)則將這些消息路由到“消息隊(duì)列”。
  • “消息隊(duì)列(message queue)”存儲消息,直到這些消息被消費(fèi)者安全處理完為止。
  • “綁定(binding)”定義了“交換機(jī)”和“消息隊(duì)列”之間的關(guān)聯(lián),提供路由規(guī)則。

AMQP定義了消息的格式,含有消息屬性和消息內(nèi)容,消息屬性中有些是針對消息代理的,不過大部分是針對上層應(yīng)用的。另外,由于網(wǎng)絡(luò)通訊是不可靠的,消息代理支持消費(fèi)者的消息確認(rèn),如果消息確認(rèn)被使用,消息代理只有收到確認(rèn)才會清掉隊(duì)列中的消息。對于不能依據(jù)綁定分發(fā)的消息,消息代理有幾種可選的方式,例如返回給發(fā)布者,直接丟棄,或扔入一個(gè)缺省隊(duì)列。發(fā)布者可以在發(fā)布消息的時(shí)候指定這些處理方式。

AMQP詳細(xì)定義了交換機(jī)類型,消息交換算法依賴于交換機(jī)類型和交換規(guī)則,AMQP里有一下幾種交換類型:

  • 直接交換(Direct Exchange):消息分發(fā)到特定路由關(guān)鍵字的隊(duì)列。
  • 擴(kuò)散交換(Fanout Exchange):消息分發(fā)到所有綁定的隊(duì)列,路由關(guān)鍵字被忽略,適合消息廣播 。
  • 主題交換(Topic Exchange):通過支持匹配規(guī)則的路由關(guān)鍵字匹配,消息分發(fā)到一個(gè)或多個(gè)消息隊(duì)列。
  • 頭部交換(Headers Exchange):通過消息頭部屬性匹配(路由關(guān)鍵字被忽略),消息分發(fā)到一個(gè)或多個(gè)消息隊(duì)列。這種方式比較靈活,但每個(gè)消息會有額外的匹配屬性。

使用這個(gè)模型我們可以很容易的模擬出存儲轉(zhuǎn)發(fā)隊(duì)列和主題訂閱這些典型的應(yīng)用場景。

AMQP可以支持一些典型的消息中間件應(yīng)用

  • 點(diǎn)對點(diǎn)連接 : 單對單
  • 存儲轉(zhuǎn)發(fā) : 多對單,多個(gè)消息發(fā)送者,單個(gè)消息接收者
  • 分布式事務(wù) : 多對多,多個(gè)消息發(fā)送者,多個(gè)消息接收者
  • 發(fā)布訂閱 : 多對多
  • 基于內(nèi)容的路由: 多對多
  • 文件傳輸隊(duì)列 : 多對多

AMQP實(shí)現(xiàn):
RabbitMQ 很好的支持了AMQP模型標(biāo)準(zhǔn),也是非常好用的消息中間件,可以用來實(shí)踐AMQP模型。

參考資料:
https://www.rabbitmq.com/tutorials/amqp-concepts.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 來源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器。支持消息的持久化、事務(wù)、擁塞控...
    jiangmo閱讀 10,513評論 2 34
  • AMQP大致內(nèi)容就是,將消息和隊(duì)列綁定起來,規(guī)定讓進(jìn)入到交換機(jī)中的具有某個(gè)路由鍵的消息進(jìn)入到指定隊(duì)列中去。 Rab...
    StevenMD閱讀 1,991評論 0 3
  • 1 RabbitMQ安裝部署 這里是ErLang環(huán)境的下載地址http://www.erlang.org/down...
    Bobby0322閱讀 2,370評論 0 11
  • 三哥打電話跟我說他失戀了,喊我出去喝啤酒,我們畢業(yè)一年了,同在一個(gè)陌生的城市,但是忙于生計(jì),平常沒事也就只是游戲上...
    云浦閱讀 421評論 0 3

友情鏈接更多精彩內(nèi)容