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