MQ 訊息佇列的解耦、介面非同步處理、削峰

lizhiqiang666發表於2019-11-12

mq 的作用有哪些?缺點有什麼?

我們大家都知道作用有解耦、介面非同步處理、流量削峰,那麼我這裡來舉例說明下這3個概念分別是什麼。

解耦

首先我們看下耦合較高的情況,誰願意負責A系統?難道被累死麼?

MQ 訊息佇列的解耦、介面非同步處理、削峰

負責A系統的大兄弟自作主張引入MQ訊息佇列後,我管你老王、老張還是老李要什麼資料,我放在MQ中,你們要就從MQ中拿,別來煩我、

MQ 訊息佇列的解耦、介面非同步處理、削峰

介面非同步處理

首先來看下沒有引入MQ時候,假設開啟一個網頁隨意點一下都需要一秒才返回資料,才響應出來,會不會感覺活在70年代,首次感覺就是 what?我在哪?這什麼、、、、

MQ 訊息佇列的解耦、介面非同步處理、削峰

使用訊息佇列後,哎呀我去,難道使用了5G網麼,響應真特麼快啊、
因為,Ajax請求到系統服務,服務響應給使用者的時間為:訊息佇列耗時+系統服務耗時;

MQ 訊息佇列的解耦、介面非同步處理、削峰

流量削峰:

ok,沒有采用MQ,使用者併發訪問直接爆了伺服器,伺服器強悍不爆,你硬體讀寫能跟得上?Mysql併發2000就要GG,直接罷工了;

MQ 訊息佇列的解耦、介面非同步處理、削峰

引入MQ,你幹不完是吧,先存起來,等你慢慢幹;
通常用於 類似於雙11 等併發訪問較大時候;
秒殺活動,也要用到;

MQ 訊息佇列的解耦、介面非同步處理、削峰

那這麼好一個東西,那就用唄,拿來用,簡單的使用沒什麼問題,但是,背後有好多問題被引申出來;
1、可用性降低,畢竟耗費了資源;
2、MQ當機了怎麼破?
》MQ一死,我整個系統全都完蛋;想過麼?

3、若MQ傳送訊息過程中訊息丟失?
》這不出事了麼,老王轉賬10W,這下好了,沒有存上錢沒了;

1、採用持久化訂閱的方式,防止訊息丟失、
同時,MQ使用手動簽到的方式、Client 真真的接收到訊息了,就簽到,否則就不簽到,直到接收到再簽到;
2、這裡說的訂閱,有人要說了pub/sub 你這隻說了Topic釋出訂閱的模式啊,PTP模式呢?
PTP模式,持久化是不會丟失訊息的;

》這裡再引申一個問題,怎麼保證MQ不會重複傳送訊息?老王從ATM取了10W,處理訊息時候MQ來了個3連發,老王卡上一共30W,一毛不剩了、

這個時候,就要引入一張狀態表記錄訊息處理的狀態了,在處理MQ傳送的訊息時候,我先查下這張表,是不是處理過相同訊息,老王已經在某一時間取了10W,UUID相同的訊息又來了,我還能再扣老王的錢?
答案顯然是不能的;

4、訊息的順序性MQ怎麼保證?
》在MQ的模型中,順序需要由3個階段去保障:

訊息被髮送時保持順序
訊息被儲存時保持和傳送的順序一致
訊息被消費時保持和儲存的順序一致

傳送時保持順序意味著對於有順序要求的訊息,使用者應該在同一個執行緒中採用同步的方式傳送。儲存保持和傳送的順序一致則要求在同一執行緒中被髮送出來的訊息A和B,儲存時在空間上A一定在B之前。而消費保持和儲存一致則要求訊息A、B到達Consumer之後必須按照先A後B的順序被處理。

MQ 訊息佇列的解耦、介面非同步處理、削峰

5、系統操作原子性怎麼保證?
A系統傳送一個命令,同時要BCD都執行成功才算完成了一個具體的業務,但是現實情況是BC完成了命令,D執行失敗了;

這樣看來,MQ問題也不少、如何去解決這些問題呢?
————————————————
版權宣告:本文為CSDN博主「打豆豆。」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/weixin_42323802/arti...

相關文章