MQ(Message Queue)消息隊列,是基礎數據結構中「先進先出」的一種數據結構。
其應用場景主要包含如下三個方面java
系統的耦合性越高,系統的容錯性就越低。以電商應用爲例,用戶建立訂單後,若是耦合調用庫存系統、物流系統、支付系統,任何一個子系統出了故障或者由於升級等緣由暫時不可用,都會形成下單操做異常,影響用戶體驗。數據庫
使用消息隊列解耦合。好比物流系統發生故障,須要幾分鐘才能修復好,在這段時間內,物流系統要處理的數據被緩存到消息隊列中,用戶的下單操做正常完成。當物流系統恢復後,補充處理存在消息隊列中的訂單消息便可,終端系統感知不到物流系統發生過幾分鐘故障。緩存
好比一個秒殺系統,當秒殺開始時,整個系統的流量會忽然間增大,這個時候,就有可能把數據庫壓垮。服務器
有了消息隊列後,能夠將大量請求緩存起來,分流到很長一段時間處理,這樣能夠大大提升系統的穩定性和用戶體驗。微信
QPS
若是是 1000,流量最高峯時是10000,爲了應對流浪高峯而去配置高性能的服務器顯然不划算,這時可使用消息隊列對峯值流量削峯。咱們先來看這樣的一個場景:數據結構
A
系統須要頻繁的更改代碼,這顯然不是一個好的設計,使用MQ
能夠解決這個問題。架構
經過消息隊列可讓數據在多個系統之間進行流通,數據的生產方不用關心誰來使用數據,只須要將數據發送到消息隊列,數據使用方直接在消息隊列中直接獲取數據便可。併發
系統引入的外部依賴越多,系統的穩定性越差,一旦MQ宕機,就會對業務形成影響。異步
MQ
的加入大大增長了系統的複雜度,之前系統間是同步的遠程調用,如今是經過MQ
進行異步調用:分佈式
A
系統處理完業務,經過MQ
給B,C,D
三個系統發送消息,若是B
系統、C
系統處理成功,D
系統處理失敗:
MQ
產品的比較常見的MQ
產品包括Kafka
,ActiveMQ
,RabbitMQ
,RocketMQ
。
| 特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
| :-------- | :--------:| :------: |:------: |------:|
| 開發語言 | java | erlang | java | scala |
| 單機吞吐量 | 萬級 | 萬級 | 10萬級 | 10萬級 |
| 時效性 | ms級 | us級 | ms級 | ms級之內 |
| 可用性 | 高(主從架構) | 高(主從架構) | 很是高(分佈式架構) | 很是高(分佈式架構)|
| 功能特性 | 成熟的產品,在不少公司獲得應用;有較多的文檔;各類協議支持較好 | 基於erlang開發,因此併發能力強;性能極其好,延時性很低;管理界面較豐富 | MQ功能比較完善,擴展性佳 | 支持主要的MQ功能;像一些消息查詢,消息回調等功能沒有提供;畢竟是爲大數據準備的,在大數據領域應用廣 |
歡迎你們關注個人微信公衆號閱讀更多文章: