消息隊列的流派

什麼是MQ

Message Queue(MQ), 消息隊列中間件, 很多人都說: MQ通過將消息的發送和接收分離來實現應用程序的異步和解耦, 這個給人的直覺是—MQ是異步的, 用來解耦的, 但是這個只是MQ的效果而不是目的, MQ真正的目的是爲了通信, 屏蔽底層複雜的通訊協議, 定義了一套應用層的, 更加簡單的通訊協議。一個分佈式系統中兩個模塊之間通訊要麼是HTTP, 要麼是自己開發的TCP, 但是這兩種協議其實都是原始的協議。HTTP協議很難實現兩端通訊—模塊A可以調用B, B也可以主動調用A, 如果要做到這個兩端都要背上WebServer, 而且還不支持長連接。TCP就更加原始了, 粘包, 心跳, 私有的協議, 想一想頭皮就發麻。MQ所要做的就是在這些協議之上構建一個簡單的協議-生產者/消費者模型。MQ帶給我的協議不是具體的通信協議, 而是更高層次通訊模型。它定義了兩個對象—發送數據的叫生產者; 接收數據的叫消費者, 提供一個SDK讓我們可以定義自己的生產者和消費者實現消息通訊而無視底層通訊協議

有Broker的MQ

這個流派通常有一臺服務器作爲Broker, 所有的消息都通過它中轉。生產者把消息發送給它就結束自己的任務了, Broker則把消息主動推送給消費者(或者消費者主動輪詢)

爲什麼需要消息隊列(MQ)?

主要原因是由於在高併發環境下, Db永遠是短板, 由於來不及同步處理, 請求往往會發生阻塞, 比如說, 大量的insert, update之類的請求同時到達MySQL, 直接導致無數的行鎖表鎖, 甚至最後請求線程會推積過多, 從而觸發too many connections錯誤。一波一波雪崩效應。通過使用消息隊列, 我們可以異步處理請求, 從而緩解系統的壓力。說了這麼多其實最核心的是: 解耦, 異步, 削峯

 

解耦

系統A有B, C, D三個系統對接, 此時D系統需要取消和A系統的對接, 同時一個新的E系統需要和A系統進行對接. 如果沒有消息隊列, A系統將需要修改代碼將調用D系統的代碼刪除, 同時修改代碼以調用E系統的接口。此時BCDE系統和A系統高度耦合

如果引入消息隊列後

A系統只需要將關鍵數據發佈到MQ, 之後如果D系統不需要和A系統對接, 僅僅只需要取消A系統的訂閱, 新增的E系統只需要訂閱A系統的消息即可, A系統自身並不需要進行修改。

消息隊列的流派

重Topic

kafka, JMS(ActiveMQ)就屬於這個流派, 生產者會發送key和數據到Broker, 由Broker比較key之後決定給哪個消費者. 這種模式就是我們最常用的模式, 是我們對MQ最多的印象。在這種模式下一個topic往往是一個比較大的概念, 甚至一個系統中就可能只有一個topic, topic某種意義上就是queue, 生產者發送key相當於說: hi, 把數據放到key的隊列中

如上圖所示, Broker定義了三個隊列, key1, key2, key3, 生產者發送數據的時候會發送key1和data, Broker在推送數據的時候則推送data(也可能把key帶上).

雖然架構一樣但是kafka的性能要比jms的性能不知道高到多少倍, 所以基本這種類型的MQ只有kafka一種備選方案。如果你需要一條暴力的數據流(在乎性能而非靈活性)那麼kafka是最好的選擇

輕Topic

這種的代表是RabbitMQ(或者說是AMQP), 生產者發送key和數據, 消費者定義訂閱的隊列, Broker收到數據之後會通過一定的邏輯計算出key對應的隊列, 然後把數據交給隊列

 

這種模式下解耦了key和queue, 在這種架構中queue是非常輕量級的(在RabbitMQ)中它的上限取決於你的內存), 消費者關心的只是自己的queue; 生產者不必關心數據最終給誰只要指定key就行了, 中間的那層映射在AMQP中叫exchange(交換機)。

AMQP中有四種exchange.

Direct exchange: key就等於queue

Fanout exchange: 無視key, 給所有的queue都來一份

Topic exchange: key可以用寬字符模糊匹配queue

Headers exchange: 無視key, 通過查看消息的頭部元數據來決定發給那個queue(AMQP頭部元數據非常豐富而可以自定義)

這種結構的架構給通訊帶來了很大的靈活性, 我們能想到的通訊方式都可以用這四種exchange表達出來。如果你需要一個企業數據總線(在乎靈活性)那麼RabbitMQ絕對值得一用

無Broker的MQ

無Broker的MQ的代表是ZeroMQ, ZeroMQ被設計成了一個庫而不是一箇中間件, 這種實現也可以達到沒有Broker的目的

可以把自己的程序想象成一個Actor, ZeroMQ就是提供郵箱功能的庫; ZeroMQ可以實現同一臺機器的RPC通訊也可以實現不同機器的TCP, UDP通訊.如果你需要一個強大的, 靈活, 野蠻的通訊能力, 別猶豫ZeroMQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章