消息隊列作用(解耦、異步、削峯)圖詳解

本篇是初次學習消息隊列整理的一些筆記,分享給初學者,祝大家學有所獲。



一、消息隊列簡介

  • 百度百科

在這裏插入圖片描述
消息隊列概念

  • MQ全稱爲Message Queue,消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。
  • 消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。

消息隊列中間件是分佈式系統中重要的組件,主要解決應用耦合異步消息流量削鋒等問題


二、解耦

  • 傳統做法
    • 傳統的做法是,訂單系統調用庫存系統的接口。如下圖:
      在這裏插入圖片描述
    • 傳統模式的缺點:假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗,訂單系統與庫存系統耦合

如何解決以上問題呢?

  • 使用消息隊列
    • 引入應用消息隊列後的方案,如下圖:
      在這裏插入圖片描述

    • 訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功

    • 庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作

    • 在下單時庫存系統不能正常使用。也不影響正常下單,因爲下單後,訂單系統寫入消息隊列就不再關心其他的後續操作了。實現訂單系統與庫存系統的應用解耦.


在這裏插入圖片描述
舉個新例子:

比如說某一個系統A要與其他系統打交道(即調用其中的方法),如果其它系統改變或者新增系統,那麼A系統都會改變,這樣的話耦合度比較高,比較麻煩。

在這裏插入圖片描述
使用消息隊列來解決這個問題。

我們A系統將產生的數據發入消息隊列中,其它的系統再去消息隊列來進行消費,那麼其他系統的減少或者新增系統即與A系統關係不大了,這樣來實現解耦的功能。

在這裏插入圖片描述


三、異步

場景說明:用戶註冊後,需要發註冊郵件和註冊短信

  • 傳統做法
    • a.串行:將註冊信息寫入數據庫成功後,發送註冊郵件,再發送註冊短
      在這裏插入圖片描述
    • b.並行:將註冊信息寫入數據庫成功後,發送註冊郵件的同時,發送註冊短信
      在這裏插入圖片描述
  • 使用消息隊列
    • 將不是必須的業務邏輯,異步處理。改造後的架構如下:
      在這裏插入圖片描述

在這裏插入圖片描述
舉個新例子

某一個用戶使用系統A,但是A要調用系統B,C,D,但是每一個系統返回的時間是不一樣的,你必須要等待全部返回後纔可以響應用戶。

在這裏插入圖片描述

如果我們這裏採用消息隊列,當用戶發送請求後,我們把數據傳給消息隊列,然後再直接響應給用戶我已經發送了信息。

在這裏插入圖片描述


四、流量削峯

場景說明:商品秒殺業務,一般會因爲流量過大,導致流量暴增,應用掛掉

  • 傳統做法

    • 限制用戶數量
  • 使用消息隊列

    • 用戶的請求,服務器接收後,首先寫入消息隊列,秒殺業務
      在這裏插入圖片描述

    • 假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面。


舉個新例子

比如平常用戶的請求我們會直接訪問數據庫,在大量用戶過來的時候,這樣的話我們會對數據庫照常比較大的壓力

在這裏插入圖片描述
在這裏我們增加一個消息隊列,這樣的話不管你請求來多少,我先存入消息隊列,然後我再讓系統慢慢的處理你的請求(如右圖),這樣很好的減緩了數據庫的訪問壓力。

在這裏插入圖片描述


五、消息通訊

消息通訊是指,消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等

  • 使用消息隊列實現點對點通信

    • 客戶端A和客戶端B使用同一隊列,進行消息通訊
      在這裏插入圖片描述
  • 使用消息隊列實現聊天室通信

    • 客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發佈和接收。實現類似聊天室效果。
      在這裏插入圖片描述

六、日誌處理

日誌處理是指將消息隊列用在日誌處理中,比如Kafka的應用,解決大量日誌傳輸的問題

  • 使用消息隊列完成日誌處理
    • 日誌採集客戶端,負責日誌數據採集,定時寫受寫入Kafka隊列
    • Kafka消息隊列,負責日誌數據的接收,存儲和轉發
    • 日誌處理應用:訂閱並消費kafka隊列中的日誌數據
      在這裏插入圖片描述

七 .使用消息隊列帶來的一些問題

在這裏插入圖片描述
1、系統可用性降低:
系統可用性在某種程度上降低,爲什麼這樣說呢?在加入MQ之前,你不用考慮消息丟失或者說MQ掛掉等等的情況,但是,引入MQ之後你就需要去考慮了!

2、系統複雜性提高:
加入MQ之後,你需要保證消息沒有被重複消費、處理消息丟失的情況、保證消息傳遞的順序性等等問題!

3、一致性問題:
我上面講了消息隊列可以實現異步,消息隊列帶來的異步確實可以提高系統響應速度。但是,萬一消息的真正消費者並沒有正確消費消息怎麼辦?這樣就會導致數據不一致的情況了。


The best investment is to invest in yourself

在這裏插入圖片描述

2020.05.16 記錄辰兮的第66篇博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章