天天看點

消息隊列及釋出/訂閱模式

摘自:《大型網站技術架構》 李智慧

1 消息驅動架構     消息驅動架構(Event Driven Architecture) :通過在底耦合的子產品之間傳輸事件消息,以保持子產品的松散耦合,并借助事件消息的通信完成子產品間合作,典型的EDA架構就是作業系統中常見的生産者消費者模式。     在大型網站中最常用的是分布式消息隊列:         

消息隊列及釋出/訂閱模式

     消息隊列利用”釋出—訂閱者模式“工作,消息發送者釋出消息,一個或者多個消息接受者訂閱消息。消息發送者是消息源,在對消息進行處理後将消息發送至分布式消息隊列,消息消息接受者從分布式消息隊列擷取該消息後繼續進行處理。        松耦合:可以看到,消息發送者和消息 接收者之間沒有直接耦合,消息發送者将消息發送至分布式消息隊列即結束對消息的處理,而消息接收者隻需要從分布式消息隊列擷取消息後進行處理,不需要知道該消息從何而來。        消息接收者在對消息進行過濾、處理、包裝後,構成一個新的消息類型,将消息繼續發送出去,等待其他消息接收者訂閱處理該消息。是以基于事件驅動的業務架構可以是一系列的流程。

2 分布式消息隊列     首先跟一般隊列一樣是一種先進先出的資料結構。分布式消息隊列可以看做将這種資料結構部署到獨立的伺服器上,通過遠端通路接口使用分布式消息隊列,進行消息存儲操作,進而實作分布式的異步調用,基本原理如圖:

消息隊列及釋出/訂閱模式

如上圖所示,我們可以明确三個步湊:

  ①消息生産者應用程式通過遠端通路接口将消息推送給消息隊列伺服器,消息隊列伺服器将消息寫入本地記憶體隊列後馬上傳回成功響應給消息生産者。

  ②消息隊列伺服器根據消息訂閱清單查找訂閱該消息的消費者應用程式,将消息隊列中的消息按照先進先出的原則将消息通過遠端通信接口發送給消費者應用程式;

  ③消費者應用程式接收到推送過來的消息之後進行相關的一系列處理,過程終止;

伸縮性:将新伺服器加入到分布式消息隊列叢集中,通知生産者伺服器更改消息隊列服務清單即可。 可用性:為了避免消費者程序處理緩慢,分布式消息伺服器記憶體空間不足的問題,如果記憶體隊列已滿,會将消息寫入磁盤,消息推送子產品在将記憶體隊列中的消息處理完後,将磁盤内容加載到記憶體隊列繼續處理。     為了避免消息隊列伺服器當機造成消息丢失,可以将消息成功發送到消息隊列的消息存儲在消息生産者伺服器,等消息真正被消息消費者伺服器處理後才删除消息。     消息隊列伺服器當機,生産者選擇分布式消息隊列伺服器中的其他機器。

3 ”釋出/訂閱“模式     “釋出/訂閱”模式包含兩種角色,分别是釋出者和訂閱者。訂閱者可以訂閱一個或若幹個頻道(channel),而釋出者可以向指定的頻道發送消息,所有訂閱此頻道的訂閱者都會收到此消息。       對任務  ”釋出/訂閱“模式很容易想到可以 使用消息隊列實作的,Redis中就包含釋出訂閱模式的指令。

繼續閱讀