消息中間件也叫消息代理,是專門用來處理消息的代理組件,消息代理從消息生產(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模型。