消息隊列-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 推送、用戶注冊 等。
應用案例
系統解耦
- 系統之間不是 強耦合的,消息接受者 可以隨意增加,而不需要修改 消息發送者的代碼。消息發送者 的成功不依賴 消息接受者。
- 不強依賴 于非本系統的核心流程,對于 非核心流程,可以放到消息隊列中讓 消息消費者 去按需消費,而 不影響核心主流程
廣播
生產者/消費者 模式,只需要關心消息是否 送達隊列,至于誰希望訂閱和需要消費,是 下游 的事情,無疑極大地減少了開發和聯調的工作量。
消息通訊
消息隊列一般都內置了 高效的通信機制,因此也可以用于單純的 消息通訊,比如實現 點對點消息隊列 或者 聊天室 等。