1.解耦:
允許你獨(dú)立的擴(kuò)展或修改兩邊的處理過程笆载,只要確保它們遵守同樣的接口約束。
2.冗余:
消息隊(duì)列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理妇穴,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn)继薛。許多消息隊(duì)列所采用的"插入-獲取-刪除"范式中忧风,在把一個消息從隊(duì)列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經(jīng)被處理完畢粪糙,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢肠缔。
3.擴(kuò)展性:
因?yàn)橄㈥?duì)列解耦了你的處理過程,所以增大消息入隊(duì)和處理的頻率是很容易的宣吱,只要另外增加處理過程即可窃这。
4.靈活性 & 峰值處理能力:
在訪問量劇增的情況下,應(yīng)用仍然需要繼續(xù)發(fā)揮作用征候,但是這樣的突發(fā)流量并不常見杭攻。如果為以能處理這類峰值訪問為標(biāo)準(zhǔn)來投入資源隨時待命無疑是巨大的浪費(fèi)洒试。使用消息隊(duì)列能夠使關(guān)鍵組件頂住突發(fā)的訪問壓力,而不會因?yàn)橥话l(fā)的超負(fù)荷的請求而完全崩潰朴上。
5.可恢復(fù)性:
系統(tǒng)的一部分組件失效時垒棋,不會影響到整個系統(tǒng)。消息隊(duì)列降低了進(jìn)程間的耦合度痪宰,所以即使一個處理消息的進(jìn)程掛掉叼架,加入隊(duì)列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理。
6.順序保證:
在大多使用場景下衣撬,數(shù)據(jù)處理的順序都很重要乖订。大部分消息隊(duì)列本來就是排序的,并且能保證數(shù)據(jù)會按照特定的順序來處理具练。(Kafka 保證一個 Partition 內(nèi)的消息的有序性)
7.緩沖:
有助于控制和優(yōu)化數(shù)據(jù)流經(jīng)過系統(tǒng)的速度乍构,解決生產(chǎn)消息和消費(fèi)消息的處理速度不一致的情況。
8.異步通信:
很多時候扛点,用戶不想也不需要立即處理消息哥遮。消息隊(duì)列提供了異步處理機(jī)制,允許用戶把一個消息放入隊(duì)列陵究,但并不立即處理它眠饮。想向隊(duì)列中放入多少消息就放多少,然后在需要的時候再去處理它們铜邮。