2023-07-08:RabbitMQ如何做到消息不丟失?
2023-07-08:RabbitMQ如何做到消息不丟失?
答案2023-07-08:
1.持久化
發(fā)送消息時(shí)設(shè)置delivery_mode屬性為2,使消息被持久化保存到磁盤,即使RabbitMQ服務(wù)器宕機(jī)也能保證消息不丟失。同時(shí),創(chuàng)建隊(duì)列時(shí)設(shè)置durable屬性為True,以確保隊(duì)列也被持久化保存。
2.確認(rèn)機(jī)制
消費(fèi)者通過basic.ack命令向RabbitMQ服務(wù)器確認(rèn)已經(jīng)消費(fèi)了消息。如果消費(fèi)者處理消息時(shí)發(fā)生錯(cuò)誤或宕機(jī),RabbitMQ會(huì)重新將消息發(fā)送給其他消費(fèi)者。RabbitMQ在接收到消費(fèi)者確認(rèn)消息前會(huì)將消息保存在內(nèi)存中,在確認(rèn)后才會(huì)刪除消息。
3.發(fā)布者確認(rèn)
RabbitMQ支持發(fā)布者確認(rèn)機(jī)制,即發(fā)布者在將消息發(fā)送到隊(duì)列后,等待RabbitMQ服務(wù)器的確認(rèn)消息。成功保存到隊(duì)列的消息會(huì)返回確認(rèn)消息給發(fā)布者,如果無法保存則返回Nack(Negative Acknowledgement)消息。通過發(fā)布者確認(rèn)機(jī)制,可以確保消息成功發(fā)送到RabbitMQ服務(wù)器。
4.備份隊(duì)列
RabbitMQ支持備份隊(duì)列(Alternate Exchange)機(jī)制,即在消息發(fā)送到隊(duì)列之前,先將消息發(fā)送到備份隊(duì)列。如果主隊(duì)列無法接收消息,RabbitMQ會(huì)將消息發(fā)送到備份隊(duì)列中。備份隊(duì)列通常是一個(gè)交換機(jī),在創(chuàng)建隊(duì)列時(shí)可以通過x-dead-letter-exchange屬性指定備份隊(duì)列。
