什麼是消息隊列 消息是指在兩個獨立的系統間傳遞的數據,這兩個系統可以是兩台電腦,也可以是兩個進程。 消息可以非常簡單,可以是簡單的字元串,也可以是保存了數據持久化的各種類型的文檔集合。 隊列是在消息的傳輸過程中的通道,是保存消息的容器,根據不同的情形,可以有先進先出,優先順序隊列等區別 。 為什麼使 ...
什麼是消息隊列
消息是指在兩個獨立的系統間傳遞的數據,這兩個系統可以是兩台電腦,也可以是兩個進程。
消息可以非常簡單,可以是簡單的字元串,也可以是保存了數據持久化的各種類型的文檔集合。
隊列是在消息的傳輸過程中的通道,是保存消息的容器,根據不同的情形,可以有先進先出,優先順序隊列等區別 。
為什麼使用消息隊列
個人覺得消息隊列主要的意義是解耦和非同步處理,以及在高併發場景下平滑短時間內大量的服務請求。
消息隊列不僅被用於系統內部組件之間的通信,同時也被用於系統跟其它服務之間的交互。
消息隊列的使用可以增加系統的可擴展性、靈活性和用戶體驗。
非基於消息隊列的系統,其運行速度取決於系統中最慢的組件的速度(註:短板效應)。
而基於消息隊列可以將系統中各組件解除耦合,這樣系統就不再受最慢組件的束縛,各組件可以非同步運行從而得以更快的速度完成各自的工作。
消息隊列能夠將業務邏輯解耦,調用方只需要下達命令而不用等待整個邏輯執行完畢。除此之外消息隊列也可以抑制性能波峰的產生,在瞬時業務增長產生時保持性能曲線的平滑。
使用消息隊列的 10 個理由
1. 解耦
在項目啟動之初來預測將來項目會碰到什麼需求,是極其困難的。消息隊列在處理過程中間插入了一個隱含的、基於數據的介面層,兩邊的處理過程都要實現這一介面。這允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的介面約束。
2. 冗餘
有時在處理數據的時候處理過程會失敗。除非數據被持久化,否則將永遠丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。在被許多消息隊列所採用的"插入-獲取-刪除"範式中,在把一個消息從隊列中刪除之前,需要你的處理過程明確的指出該消息已經被處理完畢,確保你的數據被安全的保存直到你使用完畢。
3. 擴展性
因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的;只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。擴展就像調大電力按鈕一樣簡單。
4. 靈活性 & 峰值處理能力
當你的應用上了Hacker
News的首頁,你將發現訪問流量攀升到一個不同尋常的水平。在訪問量劇增的情況下,你的應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住增長的訪問壓力,而不是因為超出負荷的請求而完全崩潰。請查看我們關於峰值處理能力的博客文章瞭解更多此方面的信息。
5. 可恢復性
當體系的一部分組件失效,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復後被處理。而這種允許重試或者延後處理請求的能力通常是造就一個略感不便的用戶和一個沮喪透頂的用戶之間的區別。
6. 送達保證
消息隊列提供的冗餘機制保證了消息能被實際的處理,只要一個進程讀取了該隊列即可。
7.排序保證
在許多情況下,數據處理的順序都很重要。消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。
8.緩衝
在任何重要的系統中,都會有需要不同的處理時間的元素。例如,載入一張圖片比應用過濾器花費更少的時間。消息隊列通過一個緩衝層來幫助任務最高效率的執行--寫入隊列的處理會儘可能的快速,而不受從隊列讀的預備處理的約束。該緩衝有助於控制和優化數據流經過系統的速度。
9. 理解數據流
在一個分散式系統里,要得到一個關於用戶操作會用多長時間及其原因的總體印象,是個巨大的挑戰。消息系列通過消息被處理的頻率,來方便的輔助確定那些表現不佳的處理過程或領域,這些地方的數據流都不夠優化。
10. 非同步通信
很多時候,你不想也不需要立即處理消息。消息隊列提供了非同步處理機制,允許你把一個消息放入隊列,但並不立即處理它。你想向隊列中放入多少消息就放多少,然後在你樂意的時候再去處理它們。