訊息佇列(mq)是什麼?
訊息佇列是什麼,或者說什麼是訊息佇列、你用過哪些訊息佇列,幾乎是在求職面試中經常問到的問題,我自己也經常問面試者這個問題,簡單說訊息佇列是一個能先進先出且儲存訊息的容器。
基本組成部分
基本的訊息佇列主要有生產者(Producer)、代理(Broker)、消費者(Consumer)組成。
- 生產者:訊息的產生者,訊息的呼叫端,主要負責訊息具體承載的資訊的例項化,具體一個佇列的發起方
- 代理:佇列的大腦,主要的處理單元,負責訊息的儲存、投遞、及各種佇列附加功能的實現,是訊息佇列最核心的組成部分
- 消費者:一個訊息佇列的終端,也是訊息的呼叫端,具體是根據消費的訊息承載的資訊,處理各種業務業務邏輯
目前市場上常用的MQ中介軟體基本上都是基於這3個主要的基礎元件擴充套件而成的,尤其是擴充套件代理,比如延遲佇列、主題 等等
使用場景
訊息佇列使用的場景非常多,常見的有非同步處理、應用解耦、流量削峰等等
- 非同步處理
非同步處理主要應用於對實時性要求不嚴格的場景,比如:使用者註冊傳送驗證碼、下單通知、傳送優惠券等等。A服務只需要把協商好的訊息傳送到訊息佇列,剩下的有消費訊息的服務去處理就好,不用等待消費服務返回結果。
- 應用解耦
應用解耦可以看作是把相關但耦合度不高的系統聯絡起來,比如,訂單系統與WMS、EHR系統,有關聯但又不是哪麼緊密,每個系統之間只需要把約定的訊息傳送到MQ,另外的系統去消費即可,同時也解決了各個系統可以採用不同的架構、語言來實現,極大的增加了整個大系統的靈活性。
- 流量削峰
流量削峰一般應用在大流量入口且短時間內業務需求處理不完的服務中心,為了權衡高可用,把大量的並行任務傳送到MQ中,依據MQ的儲存及分發功能,平穩的處理後續的業務,起到一個大流量緩衝的作用。
常見訊息佇列
目前常見的訊息佇列有ActiveMQ、RabbitMQ、Kafka、RocketMQ。但真正專案中使用的是後3種,ActiveMQ在實際的專案中並不常用,一般作為教程瞭解原理還是不錯的。另外要說明的是下列對比的表格並不完整,比如:RabbitMQ支援死信佇列,RocketMQ支援事務訊息,還有跟Kafka對標的的Pulsar,並沒有列出,想具體瞭解每個MQ,建議針去檢視官方資料。
特性 |
ActiveMQ |
RabbitMQ |
Kafka |
RocketMQ |
PRODUCER-COMSUMER |
支援 |
支援 |
支援 |
支援 |
PUBLISH-SUBSCRIBE |
支援 |
支援 |
支援 |
支援 |
REQUEST-REPLY |
支援 |
支援 |
- |
支援 |
API完備性 |
高 |
高 |
高 |
低(靜態配置) |
多語言支援 |
支援,JAVA優先 |
語言無關 |
支援,JAVA優先 |
支援 |
單機呑吐量 |
萬級 |
萬級 |
十萬級 |
單機萬級 |
訊息延遲 |
- |
微秒級 |
毫秒級 |
- |
可用性 |
高(主從) |
高(主從) |
非常高(分散式) |
高 |
訊息丟失 |
- |
低 |
理論上不會丟失 |
- |
訊息重複 |
- |
可控制 |
理論上會有重複 |
- |
文件的完備性 |
高 |
高 |
高 |
中 |
提供快速入門 |
有 |
有 |
有 |
無 |
首次部署難度 |
- |
低 |
中 |
高 |
總結
在現在的專案中,不管是TO C還是TO B ,訊息佇列(MQ)幾乎是標配的中介軟體,建議在熟悉原理的基礎上,並能清楚每種訊息中介軟體的不同點,這樣才能根據業務需求的場景更有效的採用合適的中介軟體。知識的積累在於沉澱,我們共同進步,做新時代的農民工。