宣告:本文**:mq入門總結(一)訊息佇列概念和使用場景
寫的很好,都不用自己在整理了,非常感謝該作者的用心。
訊息即是資訊的載體。為了讓訊息傳送者和訊息接收者都能夠明白訊息所承載的資訊(訊息傳送者需要知道如何構造訊息;訊息接收者需要知道如何解析訊息),它們就需要按照一種統一的格式描述訊息,這種統一的格式稱之為訊息協議(jms)。所以,有效的訊息一定具有某一種格式;而沒有格式的訊息是沒有意義的。
而訊息從傳送者到接收者的方式也有兩種。一種我們可以稱為即時訊息通訊,也就是說訊息從一端發出後(訊息傳送者)立即就可以達到另一端(訊息接收者),這種方式的具體實現就是rpc(當然單純的http通訊也滿足這個定義);另一種方式稱為延遲訊息通訊,即訊息從某一端發出後,首先進入乙個容器進行臨時儲存,當達到某種條件後,再由這個容器傳送給另一端。 這個容器的一種具體實現就是訊息佇列。
以下介紹訊息佇列在實際應用中常用的使用場景。非同步處理,應用解耦,流量削鋒和訊息通訊四個場景。
2.1、非同步處理
場景說明:使用者註冊後,需要發註冊郵件和註冊簡訊。傳統的做法有兩種1.序列的方式;2.並行方式。
(1)序列方式:將註冊資訊寫入資料庫成功後,傳送註冊郵件,再傳送註冊簡訊。以上三個任務全部完成後,返回給客戶端。
(2)並行方式:將註冊資訊寫入資料庫成功後,傳送註冊郵件的同時,傳送註冊簡訊。以上三個任務完成後,返回給客戶端。與序列的差別是,並行的方式可以提高處理的時間。
假設三個業務節點每個使用50毫秒鐘,不考慮網路等其他開銷,則序列方式的時間是150毫秒,並行的時間可能是100毫秒。
因為cpu在單位時間內處理的請求數是一定的,假設cpu1秒內吞吐量是100次。則序列方式1秒內cpu可處理的請求量是7次(1000/150)。並行方式處理的請求量是10次(1000/100)。
小結:如以上案例描述,傳統的方式系統的效能(併發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?
引入訊息佇列,將不是必須的業務邏輯,非同步處理。改造後的架構如下:
按照以上約定,使用者的響應時間相當於是註冊資訊寫入資料庫的時間,也就是50毫秒。註冊郵件,傳送簡訊寫入訊息佇列後,直接返回,因此寫入訊息佇列的速度很快,基本可以忽略,因此使用者的響應時間可能是50毫秒。因此架構改變後,系統的吞吐量提高到每秒20 qps。比序列提高了3倍,比並行提高了兩倍。
2.2、應用解耦
場景說明:使用者下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統呼叫庫存系統的介面。如下圖:
傳統模式的缺點:
1) 假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗;
2) 訂單系統與庫存系統耦合;
如何解決以上問題呢?引入應用訊息佇列後的方案,如下圖:
2.3、流量削鋒
流量削鋒也是訊息佇列中的常用場景,一般在秒殺或團搶活動中使用廣泛。
應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入訊息佇列。
可以控制活動的人數;
可以緩解短時間內高流量壓垮應用;
使用者的請求,伺服器接收後,首先寫入訊息佇列。假如訊息佇列長度超過最大數量,則直接拋棄使用者請求或跳轉到錯誤頁面;
秒殺業務根據訊息佇列中的請求資訊,再做後續處理。
2.4、日誌處理
日誌處理是指將訊息佇列用在日誌處理中,比如kafka的應用,解決大量日誌傳輸的問題。架構簡化如下:
(1)kafka:接收使用者日誌的訊息佇列。
(2)logstash:做日誌解析,統一成json輸出給elasticsearch。
(3)elasticsearch:實時日誌分析服務的核心技術,乙個schemaless,實時的資料儲存服務,通過index組織資料,兼具強大的搜尋和統計功能。
(4)kibana:基於elasticsearch的資料視覺化元件,超強的資料視覺化能力是眾多公司選擇elk stack的重要原因。
它有兩種訊息模式:點對點模式和發布訂閱模式
3.1、點對點模式
點對點模式包含三個角色:訊息佇列(queue),傳送者(sender),接收者(receiver)。每個訊息都被傳送到乙個特定的佇列,接收者從佇列中獲取訊息。佇列保留著訊息,直到他們被消費或超時。
點對點的特點
每個訊息只有乙個消費者(consumer)(即一旦被消費,訊息就不再在訊息佇列中)
傳送者和接收者之間在時間上沒有依賴性,也就是說當傳送者傳送了訊息之後,不管接收者有沒有正在執行,它不會影響到訊息被傳送到佇列
接收者在成功接收訊息之後需向佇列應答成功
如果希望傳送的每個訊息都會被成功處理的話,那麼需要p2p模式。
3.2、發布訂閱模式
包含三個角色:主題(topic),發布者(publisher),訂閱者(subscriber)。多個發布者將訊息傳送到topic,系統將這些訊息傳遞給多個訂閱者。
pub/sub的特點
每個訊息可以有多個消費者
發布者和訂閱者之間有時間上的依賴性。針對某個主題(topic)的訂閱者,它必須建立乙個訂閱者之後,才能消費發布者的訊息。
為了消費訊息,訂閱者必須保持執行的狀態。
為了緩和這樣嚴格的時間相關性,jms允許訂閱者建立乙個可持久化的訂閱。這樣,即使訂閱者沒有被啟用(執行),它也能接收到發布者的訊息。
如果希望傳送的訊息可以不被做任何處理、或者只被乙個訊息者處理、或者可以被多個消費者處理的話,那麼可以採用pub/sub模型。
想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要麼別想,要麼多做。上尉
訊息佇列(MQ)簡介與應用場景
一 官方描述 mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入佇列的訊息 針對應用程式的資料 來通訊,而無需專用連線來鏈結它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用於諸如遠端過...
訊息佇列使用場景
1 非同步處理 減少等待時間,更快的返回處理結果,提高系統效能以及更好的使用者體驗。fe 在乙個秒殺系統中,可能需要如下幾步 風險控制,鎖定庫存,生成訂單,訊息通知以及統計資料,在未優化的情況下,使用者請求到達閘道器後進入服務端要至少 經歷這五個步驟,但是對於秒殺系統而言關鍵的步驟在於風險控制和鎖定...
訊息佇列的使用場景
知乎 假設使用者在你的軟體中註冊,服務端收到使用者的註冊請求後,它會做這些操作 校驗使用者名稱等資訊,如果沒問題會在資料庫中新增乙個使用者記錄 如果是用郵箱註冊會給你傳送一封註冊成功的郵件,手機註冊則會傳送一條簡訊 分析使用者的個人資訊,以便將來向他推薦一些志同道合的人,或向那些人推薦他 傳送給使用...