什麼是訊息佇列?

2020-08-14 11:06:36

1、什麼是訊息佇列?

訊息佇列:也就是MQ(Message Queue),是基礎數據結構中「先進先出」的一種數據結構。一般用來解決應用解耦,非同步訊息,流量削鋒等問題,實現高效能,高可用,可伸縮和最終一致性架構。
在这里插入图片描述

指把要傳輸的數據(訊息)放在佇列中,用佇列機制 機製來實現訊息傳遞——生產者產生訊息並把訊息放入佇列,然後由消費者去處理。消費者可以到指定佇列拉取訊息,或者訂閱相應的佇列,由MQ伺服器端給其推播訊息。

概念
1、把數據放到訊息佇列叫做 生產者
2、從訊息佇列裏邊去數據叫做 消費者

2、爲什麼要使用訊息佇列

解耦: 一個業務需要多個模組共同實現,或者一條訊息有多個系統需要對應處理,只需要主業務完成以後,發送一條MQ,其餘模組消費MQ訊息,即可實現業務,降低模組之間的耦合。
在这里插入图片描述

場景描述: 系統A產生 userId,現在系統B和C需要用這個 userId 做相關操作,過幾天說,系統B使用 userId 的介面不用了,讓A別去呼叫它。 然後又說D系統也需要用A的 userId,得呼叫介面 …

那麼,系統A將 userId 寫到訊息佇列中,系統 C 和 D 從訊息佇列中拿數據。無論誰用都和系統A沒關係。且即使其他系統掛掉或者請求超時都不會影響到系統A,只和訊息佇列有關。 這樣就完成瞭解耦。

非同步: 主業務執行結束後從屬業務通過MQ,非同步執行,減低業務的響應時間,提高使用者體驗。
在这里插入图片描述

場景描述: 系統A直接呼叫系統B、C、D,有上圖得出這次請求需要 50+300+300+300=950ms, 系統A做的主要業務,而系統B、C、D不是。比如系統A處理的是訂單下單,而系統B是訂單下單成功了,那發送一條簡訊告訴具體的使用者此訂單已成功,系統C和D也是處理小事。

爲了提高使用者體驗和吞吐量,非同步地呼叫系統B、C、D的介面。系統A執行完了以後,將 userId 寫到訊息佇列中,然後直接返回(其它操作,非同步處理)。現在只需要 100ms

削峯: 高併發情況下,業務非同步處理,提供高峯期業務處理能力,避免系統癱瘓。
在这里插入图片描述

場景描述: 假設每個月要搞一次大促,大促期間的併發可能會很高的,比如每秒3000個請求。假設我們現在有兩臺機器處理請求,並且每臺機器只能每次處理1000個請求。

多出的1000個請求可能會把整個系統搞崩了,所以我們可以寫到訊息佇列中:系統B和系統C根據自己的能夠處理的請求數去訊息佇列中拿數據,這樣即便有每秒有8000個請求,那隻是把請求放在訊息佇列中,去拿訊息佇列的訊息由系統自己去控制,這樣就不會把整個系統給搞崩。

3、使用訊息佇列的問題

1、系統可用性降低。依賴服務也多,服務越容易掛掉。需要考慮MQ癱瘓的情況。

2、系統複雜性提高。需要考慮訊息丟失、訊息重複消費、訊息傳遞的順序性。

我們將數據寫到訊息佇列上,系統B和C還沒來得及取訊息佇列的數據,就掛掉了。如果沒有做任何的措施,我們的數據就丟了。

3、業務一致性。主業務和從屬業務一致性的處理。