為什么使用消息隊列


什么是消息隊列

消息是指在兩個獨立的系統間傳遞的數據,這兩個系統可以是兩台計算機,也可以是兩個進程。

消息可以非常簡單,可以是簡單的字符串,也可以是保存了數據持久化的各種類型的文檔集合。

隊列是在消息的傳輸過程中的通道,是保存消息的容器,根據不同的情形,可以有先進先出,優先級隊列等區別 。

為什么使用消息隊列

個人覺得消息隊列主要的意義是解耦和異步處理,以及在高並發場景下平滑短時間內大量的服務請求

消息隊列不僅被用於系統內部組件之間的通信,同時也被用於系統跟其它服務之間的交互

消息隊列的使用可以增加系統的可擴展性、靈活性和用戶體驗

非基於消息隊列的系統,其運行速度取決於系統中最慢的組件的速度(注:短板效應)。

而基於消息隊列可以將系統中各組件解除耦合,這樣系統就不再受最慢組件的束縛,各組件可以異步運行從而得以更快的速度完成各自的工作。

消息隊列能夠將業務邏輯解耦,調用方只需要下達命令而不用等待整個邏輯執行完畢。除此之外消息隊列也可以抑制性能波峰的產生,在瞬時業務增長產生時保持性能曲線的平滑。


使用消息隊列的 10 個理由

1. 解耦
在項目啟動之初來預測將來項目會碰到什么需求,是極其困難的。消息隊列在處理過程中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口。這允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。

2. 冗余
有時在處理數據的時候處理過程會失敗。除非數據被持久化,否則將永遠丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。在被許多消息隊列所采用的"插入-獲取-刪除"范式中,在把一個消息從隊列中刪除之前,需要你的處理過程明確的指出該消息已經被處理完畢,確保你的數據被安全的保存直到你使用完畢。

3. 擴展性
因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的;只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。擴展就像調大電力按鈕一樣簡單。

4. 靈活性 & 峰值處理能力
當你的應用上了Hacker News的首頁,你將發現訪問流量攀升到一個不同尋常的水平。在訪問量劇增的情況下,你的應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見;如果為以能處理這類峰值訪問為標准來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住增長的訪問壓力,而不是因為超出負荷的請求而完全崩潰。請查看我們關於峰值處理能力的博客文章了解更多此方面的信息。

5. 可恢復性
當體系的一部分組件失效,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復后被處理。而這種允許重試或者延后處理請求的能力通常是造就一個略感不便的用戶和一個沮喪透頂的用戶之間的區別。

6. 送達保證
消息隊列提供的冗余機制保證了消息能被實際的處理,只要一個進程讀取了該隊列即可。

7.排序保證
在許多情況下,數據處理的順序都很重要。消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。

8.緩沖

在任何重要的系統中,都會有需要不同的處理時間的元素。例如,加載一張圖片比應用過濾器花費更少的時間。消息隊列通過一個緩沖層來幫助任務最高效率的執行--寫入隊列的處理會盡可能的快速,而不受從隊列讀的預備處理的約束。該緩沖有助於控制和優化數據流經過系統的速度。

9. 理解數據流
在一個分布式系統里,要得到一個關於用戶操作會用多長時間及其原因的總體印象,是個巨大的挑戰。消息系列通過消息被處理的頻率,來方便的輔助確定那些表現不佳的處理過程或領域,這些地方的數據流都不夠優化。

10. 異步通信

很多時候,你不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許你把一個消息放入隊列,但並不立即處理它。你想向隊列中放入多少消息就放多少,然后在你樂意的時候再去處理它們。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM