消息隊列是什么,或者說什么是消息隊列、你用過哪些消息隊列,幾乎是在求職面試中經常問到的問題,我自己也經常問面試者這個問題,簡單說消息隊列是一個能先進先出且存儲消息的容器。
基本組成部分
基本的消息隊列主要有生產者(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)幾乎是標配的中間件,建議在熟悉原理的基礎上,并能清楚每種消息中間件的不同點,這樣才能根據業務需求的場景更有效的采用合適的中間件。知識的積累在于沉淀,我們共同進步,做新時代的農民工。