github上面的rabbitMq的測試代碼:https://github.com/wuzhong290/rabbitmq.git
要想保住RabbitMQ消息不丟失,需要從下面幾個方面進(jìn)行完善。
一、消息持久化
要想做到消息持久化羡儿,必須滿足以下三個條件,缺一不可。
1训措、Exchange 設(shè)置持久化:durable:true
new TopicExchange("amq.topic")創(chuàng)建的Exchange就是持久化的。
org.springframework.amqp.core.AbstractExchange構(gòu)造方法如下:
2光羞、Queue 設(shè)置持久化
new Queue(queueName)創(chuàng)建的Queue就是持久化的绩鸣。
org.springframework.amqp.core.Queue構(gòu)造方法如下:
3、Message持久化發(fā)送
發(fā)送消息設(shè)置發(fā)送模式deliveryMode=2代表持久化消息
org.springframework.amqp.rabbit.core.RabbitTemplate默認(rèn)情況下發(fā)送模式為deliveryMode=2
org.springframework.amqp.core.MessageProperties的默認(rèn)發(fā)送模式:
二纱兑、ACK確認(rèn)機(jī)制
1呀闻、消息發(fā)送確認(rèn)
ConfirmCallback? 只確認(rèn)消息是否正確到達(dá) Exchange 中。
ReturnCallback? 消息沒有正確到達(dá)隊(duì)列時(shí)觸發(fā)回調(diào)潜慎,如果正確到達(dá)隊(duì)列不執(zhí)行捡多。
github上面的代碼:https://github.com/wuzhong290/rabbitmq.git
執(zhí)行com.demo.message.TestReturnCallback方法testReturnCallback能夠看效果。
2铐炫、消息接收確認(rèn)
默認(rèn)情況下消息消費(fèi)者是自動 ack (確認(rèn))消息的局服,需要設(shè)置為手動確認(rèn),原因是:自動確認(rèn)會在消息發(fā)送給消費(fèi)者后立即確認(rèn)驳遵,這樣存在丟失消息的可能淫奔。
github上面的代碼:https://github.com/wuzhong290/rabbitmq.git
執(zhí)行com.demo.message.TestManualAcks方法testMQ能夠看效果。
com.demo.message.example.NoticeHandlerACK演示了手動確認(rèn)消費(fèi)者的實(shí)現(xiàn)堤结。
3唆迁、參考資料
參考http://www.reibang.com/p/2c5eebfd0e95
上面文章的消息發(fā)送確認(rèn)ReturnCallback部分需要完善一下:
return-callback="returnCallback" mandatory="true"同時(shí)設(shè)置了才有效。和rabbit:connection-factory 的publisher-returns="true"沒有關(guān)系竞穷。
三唐责、設(shè)置集群鏡像模式
參考http://www.reibang.com/p/dd706e9ee80d 文章中的《6、HA 鏡像模式隊(duì)列設(shè)置》
四瘾带、消息補(bǔ)償機(jī)制
在消息發(fā)送鼠哥、接受時(shí)記錄DB日志,定時(shí)輪訓(xùn)DB日志看政,查明哪些發(fā)送消息沒有成功消費(fèi)朴恳,啟動重新發(fā)送消息機(jī)制。