白話講解 訊息佇列到底解決了什麼問題?

2021-10-09 02:29:26 字數 2927 閱讀 8023

2023年處於移動網際網路的下半場,各種技術層出不窮,雖然資料也在爆發式增長,但是高併發、高吞吐已經不再是首要的痛點,穩定、可靠才是王道。

1  什麼是訊息佇列

訊息佇列(message queue),從廣義上講是一種訊息佇列服務中介軟體,提供一套完整的資訊生產、傳遞、消費的軟體系統。

訊息佇列所涵蓋的功能遠不止於佇列(queue),其本質是兩個程序傳遞資訊的一種方法。兩個程序可以分布在同一臺機器上,亦可以分布在不同的機器上。

眾所周知,程序通訊可以通過rpc(remote procedure call,遠端過程呼叫)進行,那麼我們為什麼要用訊息佇列這種軟體服務來傳遞訊息呢?

下面我們以春節訂火車票為例進行說明,流程如下。

第一步:輸入車票資訊,傳送訂票請求。

起點站:北京。

終點站:成都。

票數:2張。

座席:硬臥。

第三步:3s後,應用告訴你訂票失敗。

(1)今天這個車次只售出4000張票,而實際有30萬人傳送了訂票資訊,如果逐一請求處理,那麼90%以上的人都將要耗時3s來等待,怎麼辦?

(2)下游有20個系統需要在訂票成功後進行通知,如果逐一呼叫這些系統的介面進行通知,而其中乙個通知任務執行失敗,那麼已經通知成功的任務會怎樣?

以上只是隨機列舉了一些常見的問題,如何才能優雅地處理呢?

答案是:訊息佇列!

2  為什麼需要訊息佇列

我們平時什麼時候可能會用到訊息佇列呢?下面結合剛才的流程圖來介紹訊息佇列的適用場景。

▊ 削峰填谷

業務系統在超高併發場景中,由於後端服務來不及同步處理過多、過快的請求,可能導致請求堵塞,嚴重時可能由於高負荷拖垮web伺服器。

優點是顯而易見的,短時間內吞吐量增加了好幾倍,甚至數十倍。缺點也明顯,流量低峰期伺服器相對較閒。

如何平衡平時的空閒與節假日的超高峰呢?我們想到了訊息佇列(比如apache rocketmq,apache kafka),也是目前業界比較常用的手段。利用訊息佇列扭轉處理訂票請求,告知使用者30min內會告訴他/她訂票結果。優缺點明顯:效能提公升了,但是我們作為業務開發人員,還要維護乙個訊息佇列服務,人手完全不夠。訊息中介軟體呼之欲出。

▊ 程式間解耦

不同的業務端在聯合開發功能時,常常由於排期不同、人員調配不方便等原因導致專案延期。其實,其根本原因是業務耦合過度。

下圖中,上下游系統之間的通訊是彼此依賴的,所以不得不協調上下游所有的資源同步進行,跨團隊處理問題顯然比在團隊內部處理問題難度大。

你是否依稀記得另乙個團隊的同事呼叫你的api,你告訴他發個請求過來,你打斷點一步一步除錯**的場景?

你是否記得為了協調開發資源、qa資源,以及協調上線時間等所做的一切,你被老闆罵了多少次,最後還是延期了:我們依賴他們,他們的qa說,高峰期不讓發布。

加入訊息佇列後,不同的業務端又會是何種情況呢?

上下游系統進行開發、聯調、上線,彼此完全不依賴,也就是說,系統間解耦了。

▊非同步處理

處理訂票請求是乙個漫長的過程,需要檢查預訂的車次是否有預訂數量的票、下單扣庫存、更新快取等一系列操作。這些耗時的操作,我們可以通過使用訊息佇列的方式,把提交請求成功的訊息告訴使用者。然後非同步處理這些耗時的操作,保證30min內能把處理的結果通過簡訊推送給使用者,否則系統處理多久,使用者就會等多久。

▊ 資料的最終一致性

我們舉例說明。很懷念每月的1號,可以向老婆的「財務部」繳費了。你的工資在招商銀行,你老婆的工資在北京銀行。通常,兩個系統的通訊過程如下。

如果通訊失敗,怎麼保證你的錢「上交」了呢?業內常用的手段就是訊息佇列。訊息系統的優點:

(3)即使北京銀行服務不可用,業務也不受影響。

apache rocketmq是一款開源的、分布式的訊息投遞與流資料平台。出生自阿里巴巴,經歷了近十年雙11核心交易鏈路打磨,可以支撐萬億級訊息洪峰。

作為apache頂級開源專案之一,其在github上有10000+ star、5000+ fork、170+ contributors(在github上提交**並被採納的開發者),目前中國網際網路、金融等行業top級企業75%以上都在使用,已經成為雲原生時代企業上雲的核心基礎設施!

李偉 著

作者有多年分布式系統的實戰經驗,特別是在訊息佇列方面經驗豐富。本書根據作者在專案中使用rocketmq的實際經驗,結合實際原始碼,由淺入深地講解了rocketmq核心功能的具體實現邏輯,並從訊息佇列的應用場景出發,使讀者快速地了解mq解決的問題域。

通過閱讀本書,不僅可以了解如何在專案中使用訊息佇列,還能學習到rocketmq的實現細節,進一步提公升對rocketmq系統本身的把控力度。

訊息佇列講解

需要包含標頭檔案 include include include此外,其中msg一共提供四種操作函式,msgget,msgsnd,msgrcv,msgctl msgget是用來得到訊息佇列的識別符號或者建立訊息佇列 訊息佇列一旦建立除非顯示刪除或者重啟機器,否則將一直存在 在命令列下使用ipcs這個...

Linux講解 程序間通訊 訊息佇列

實現程序間通訊 訊息佇列的客戶端程式 include include include include include include include define ipc key 0x12345678 這是訊息佇列的key 在核心中訊息佇列的識別符號 可以設定為常數也可以通過ftok函式來獲取 ft...

訊息佇列如何解決訊息積壓問題

訊息佇列訊息積壓了怎麼辦?q 剛開始是對這個疑問抱有質疑態度的,因為使用訊息佇列的其中目的就是削峰填谷,來避免高流量時,對下游服務的衝擊,所以使用訊息佇列進行緩衝,下游根據自己的消費能力去消費,我感覺這就是訊息積壓本就是使用訊息佇列的功能,怎麼會是問題呢?a 首先訊息積壓是正常現象,但凡是過多就不正...