
MQ 服務(wù)端的可靠性問題背景默認(rèn)情況下RabbitMQ 收到消息優(yōu)先放在內(nèi)存降低收發(fā)延遲。帶來兩個(gè)問題MQ 宕機(jī)重啟內(nèi)存中的消息直接丟失docker restart mq復(fù)現(xiàn)內(nèi)存容量有限消費(fèi)者故障 / 消費(fèi)慢消息大量積壓觸發(fā) pageoutMQ 會阻塞。 MQ 底層會把老舊消息刷到磁盤釋放內(nèi)存但刷盤過程會阻塞 MQ。解決方案數(shù)據(jù)持久化 Lazy Queue1. 數(shù)據(jù)持久化RabbitMQ 持久化分為三部分交換機(jī)持久化隊(duì)列持久化默認(rèn) durable消息持久化發(fā)送消息設(shè)置delivery_mode 2delivery_mode1臨時(shí)消息存在內(nèi)存重啟丟失delivery_mode2持久消息寫入磁盤特點(diǎn)開啟生產(chǎn)者確認(rèn)后持久化需要等待磁盤寫入完成才返回 ACK速度會變慢但不會出現(xiàn) pageout 阻塞問題。2. Lazy Queue惰性隊(duì)列3.6 版本引入3.12 版本之后所有隊(duì)列默認(rèn)都是 LazyQueue機(jī)制消息到達(dá)隊(duì)列后直接存入磁盤不優(yōu)先放內(nèi)存消費(fèi)者消費(fèi)時(shí)才從磁盤加載到內(nèi)存優(yōu)勢支持百萬級海量消息堆積寫盤性能高避免 pageout 阻塞問題RabbitMQ 如何保證消息的可靠性總結(jié)首先通過配置可以讓交換機(jī)、隊(duì)列、以及發(fā)送的消息都持久化。這樣隊(duì)列中的消息會持久化到磁盤MQ 重啟消息依然存在。RabbitMQ 在 3.6 版本引入了 LazyQueue并且在 3.12 版本后會稱為隊(duì)列的默認(rèn)模式。LazyQueue 會將所有消息都持久化。開啟持久化和生產(chǎn)者確認(rèn)時(shí)RabbitMQ 只有在消息持久化完成后才會給生產(chǎn)者返回 ACK 回調(diào)。