1. 程式人生 > >訊息佇列-Message Queue

訊息佇列-Message Queue

訊息佇列-Message Queue

目前隨著網際網路的普及以及上網使用者的增多,擁有一套 安全穩定低耦合高效能內部通訊工具尤為重要。

什麼是訊息佇列?

訊息佇列(英語:Message queue)是一種程序間通訊或同一程序的不同執行緒間的通訊方式,軟體的貯列用來處理一系列的輸入,通常是來自使用者。訊息佇列提供了非同步的通訊協議,每一個貯列中的紀錄包含詳細說明的資料,包含發生的時間,輸入裝置的種類,以及特定的輸入引數,也就是說:訊息的傳送者和接收者不需要同時與訊息佇列互交。訊息會儲存在佇列中,直到接收者取回它。 ——維基百

訊息佇列

是指利用 高效可靠 的 訊息傳遞機制 進行與平臺無關的 資料交流,並基於 資料通訊 來進行分散式系統的整合。 ——網際網路

這些解釋都太深奧,我們通過圖片來了解一下。

  • Producer:訊息生產者,負責產生和傳送訊息到 Broker;
  • Broker:訊息處理中心。負責訊息儲存、確認、重試等,一般其中會包含多個 queue;
  • Consumer:訊息消費者,負責從 Broker 中獲取訊息,並進行相應處理;

可能這個模型還是過於專業,那我們再看一個通俗一點的:

此時有一封信件,加入到佇列中,然後接收者從佇列中拿出自己的信件,這個佇列就好比 郵箱

訊息佇列 一般作為 應用程式中的中介軟體。通過提供 訊息傳遞訊息排隊 模型,它可以在 分散式環境 下提供 應用解耦彈性伸縮冗餘儲存流量削峰非同步通訊資料同步 等等功能,其作為 分散式系統架構 中的一個重要元件,有著舉足輕重的地位。

訊息佇列的特點

非同步性

訊息傳送者 可以傳送一個訊息而無須等待響應。訊息傳送者 將訊息傳送到一條 虛擬的通道(主題 或 佇列) 上,訊息接收者訂閱 或是 監聽 該通道。一條資訊可能最終轉發給 一個或多個 訊息接收者,這些接收者都無需對 訊息傳送者 做出 同步迴應。整個過程都是 非同步的

解耦合

主要體現在如下兩點:

  • 傳送者和接受者不必瞭解對方、只需要 確認訊息
  • 傳送者和接受者 不必同時線上

比如線上交易系統為了保證資料的 最終一致,在 支付系統 處理完成後會把 支付結果 放到 訊息中介軟體 裡,通知 訂單系統 修改 訂單支付狀態。兩個系統是通過訊息中介軟體解耦的。

分散式

通過對 消費者 的橫向擴充套件,降低了訊息佇列 阻塞 的風險,以及單個消費者產生單點故障的可能性(當然訊息佇列本身也可以做成分散式叢集)。

可靠性

訊息佇列 一般會把接收到的訊息儲存到 本地硬碟 上(當訊息被處理完之後,儲存資訊根據不同的訊息佇列實現,有可能將其刪除),這樣即使 應用掛掉 或者 訊息佇列 本身掛掉,訊息也能夠 重新載入

訊息佇列的傳輸模式

首先看一個經典的 訊息佇列的傳遞服務模型

MOM: Message Oriented Middleware 訊息的中介軟體

訊息佇列目前有兩大分類: 點對點(P2P)

點對點模型 用於 訊息生產者訊息消費者 之間 點到點 的通訊。訊息生產者將訊息傳送到由某個名字標識的特定消費者。這個名字實際上對於消費服務中的一個 佇列Queue),在訊息傳遞給消費者之前它被 儲存 在這個佇列中。佇列訊息 可以放在 記憶體 中也可以 持久化,以保證在訊息服務出現故障時仍然能夠傳遞訊息。

一句話總結:訊息生產者生產訊息傳送到queue中,然後訊息消費者從queue中取出並且消費訊息,訊息被消費以後,queue中不再有儲存,所以訊息消費者不可能消費到已經被消費的訊息。Queue支援存在多個消費者,但是對一個訊息而言,只會有一個消費者可以消費。
**

釋出/訂閱模型(Pub/Sub)

釋出者/訂閱者 模型支援向一個特定的 訊息主題 生產訊息。0多個訂閱者 可能對接收來自 特定訊息主題 的訊息感興趣。

在這種模型下,釋出者和訂閱者彼此不知道對方,就好比是匿名公告板。這種模式被概況為:多個消費者可以獲得訊息,在 釋出者訂閱者 之間存在 時間依賴性。釋出者需要建立一個 訂閱(subscription),以便能夠消費者訂閱。訂閱者 必須保持 持續的活動狀態接收訊息

在這種情況下,在訂閱者 未連線時,釋出的訊息將在訂閱者 重新連線重新發布,如下圖所示:

特性:

  • 每個訊息可以有多個訂閱者;
  • 客戶端只有訂閱後才能接收到訊息;
  • 持久訂閱和非持久訂閱。
  • 釋出者和訂閱者有時間依賴:接受者和釋出者只有建立訂閱關係才能收到訊息;
  • 持久訂閱:訂閱關係建立後,訊息就不會消失,不管訂閱者是否都線上;
  • 非持久訂閱:訂閱者為了接受訊息,必須一直線上。 當只有一個訂閱者時約等於點對點模式

訊息佇列應用場景

當你需要使用 訊息佇列 時,首先需要考慮它的必要性。可以使用訊息佇列的場景有很多,最常用的幾種,是做 應用程式鬆耦合、非同步處理模式、釋出與訂閱、最終一致性、錯峰流控 和 日誌緩衝 等。

非同步處理

非核心 流程 非同步化,減少系統 響應時間,提高 吞吐量。例如:簡訊通知、終端狀態推送、App 推送、使用者註冊 等。

應用案例

系統解耦

  • 系統之間不是 強耦合的,訊息接受者 可以隨意增加,而不需要修改 訊息傳送者的程式碼。訊息傳送者 的成功不依賴 訊息接受者。
  • 不強依賴 於非本系統的核心流程,對於 非核心流程,可以放到訊息佇列中讓 訊息消費者 去按需消費,而 不影響核心主流程

廣播

生產者/消費者 模式,只需要關心訊息是否 送達佇列,至於誰希望訂閱和需要消費,是 下游 的事情,無疑極大地減少了開發和聯調的工作量。

訊息通訊

訊息佇列一般都內建了 高效的通訊機制,因此也可以用於單純的 訊息通訊,比如實現 點對點訊息佇列 或者 聊天室 等。