相關概念
訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用耦合,非同步訊息,流量削峰等問題。實現高效能,高可用,可伸縮和最終一致性架構,是大型分散式系統不可缺少的中介軟體。流量如果非常之巨大,訊息佇列必不可少的。
使用場景
非同步處理
場景說明:當使用者註冊成功後,傳送註冊郵件,發完郵件然後傳送註冊簡訊。
傳統序列方式:將註冊資訊寫入資料庫成功後,向使用者傳送郵件,再傳送註冊簡訊,將結果返回客戶端。
對於客戶端接收來說,經歷了三個業務節點:入庫、郵件、簡訊,對於使用者就會消耗累積三個業務節點的時間。
優化方式
並行方式:將註冊資訊寫入資料庫成功後,傳送註冊郵件的同時也傳送註冊簡訊,以上三個任務完成後,返回給客戶端。這樣節省了一個業務節點環節。
訊息佇列:將註冊資訊寫入資料庫成功後,註冊資訊寫入訊息佇列,傳送郵件和簡訊的消費者非同步讀取訊息佇列,寫入訊息佇列即將結果返回給客戶端,告訴使用者註冊成功。(後臺跑消費者,通過消費者消費訊息佇列,完成郵件和簡訊的傳送)
應用解耦
場景說明:電商平臺日益強大之後,我們可以將訂單系統和庫存系統分離,使用者下單後,訂單系統需要通知庫存系統,比如庫存有100個商品,使用者下單成功之後通知庫存系統做處理。
傳統方式:訂單系統呼叫庫存系統的介面。這種方式並不是很可靠,比如我們在訪問介面的時候,系統掛了,或者庫存系統掛了,這樣使用者下單就會失敗。
訊息佇列
訂單系統:使用者下單後,訂單系統完成持久化處理,將訊息寫入訊息佇列,返回使用者訂單下單成功,先不管庫存的事。
庫存系統:訂閱下單的訊息,採用拉/推得方式,獲取下單資訊,庫存系統根據下單資訊,進行庫存操作,這樣使用者下單的時候不管庫存的事。
流量削峰
場景說明:比如電商平臺做秒殺活動,一般會因為流量過大,導致流量暴增,服務端壓力會巨大。
傳統方式:服務端突然接收到來自前端的大量訂單請求。
訊息佇列:在應用前端加入訊息佇列。
1:當使用者請求,伺服器接收後,首先寫入訊息佇列。假如訊息佇列長度超過最大數量,則直接拋棄使用者請求或者跳轉到其他頁面,不至於伺服器掛掉影響其他使用者請求。
2:秒殺業務根據訊息佇列中的請求資訊,再做後續處理。
日誌處理
解決大量日誌傳輸的問題
日誌採集客戶端,負責日誌資料採集,寫入RabbitMq、kafka佇列。
RabbitMq、kafka訊息佇列,負責日誌資料的接收,儲存和轉發。
日誌處理應用:訂閱並消費RabbitMq、kafka佇列中的日誌資料,進行處理。
訊息通訊
點對點訊息佇列,或者聊天室
點對點:客戶端A和客戶端B使用同一佇列,進行訊息通訊,就相當於A和B通話。
聊天室:客戶端A,客戶端B,客戶端N訂閱同一個主題,進行訊息釋出和接收,相當於QQ群、微信群。