爲何使用消息隊列

什麼是消息隊列

消息是指在兩個獨立的系統間傳遞的數據,這兩個系統能夠是兩臺計算機,也能夠是兩個進程。安全

消息能夠很是簡單,能夠是簡單的字符串,也能夠是保存了數據持久化的各類類型的文檔集合。併發

隊列是在消息的傳輸過程當中的通道,是保存消息的容器,根據不一樣的情形,能夠有先進先出,優先級隊列等區別 。異步

爲何使用消息隊列

我的以爲消息隊列主要的意義是解耦和異步處理,以及在高併發場景下平滑短期內大量的服務請求分佈式

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

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

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

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

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


使用消息隊列的 10 個理由

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

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

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

4. 靈活性 & 峯值處理能力
當你的應用上了Hacker News的首頁,你將發現訪問流量攀升到一個不一樣尋常的水平。在訪問量劇增的狀況下,你的應用仍然須要繼續發揮做用,可是這樣的突發流量並不常見;若是爲以能處理這類峯值訪問爲標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列可以使關鍵組件頂住增加的訪問壓力,而不是由於超出負荷的請求而徹底崩潰。請查看咱們關於峯值處理能力的博客文章瞭解更多此方面的信息。

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

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

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

8.緩衝

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

9. 理解數據流
在一個分佈式系統裏,要獲得一個關於用戶操做會用多長時間及其緣由的整體印象,是個巨大的挑戰。消息系列經過消息被處理的頻率,來方便的輔助肯定那些表現不佳的處理過程或領域,這些地方的數據流都不夠優化。

10. 異步通訊

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

相關文章
相關標籤/搜索