十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要講解了“rabbitmq 如何處理消息丟失的問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“rabbitmq 如何處理消息丟失的問題”吧!
創(chuàng)新互聯(lián)長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為絳縣企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站設(shè)計,絳縣網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
1)生產(chǎn)者弄丟了數(shù)據(jù)
生產(chǎn)者將數(shù)據(jù)發(fā)送到rabbitmq的時候,可能數(shù)據(jù)就在半路給搞丟了,因?yàn)榫W(wǎng)絡(luò)啥的問題,都有可能。
此時可以選擇用rabbitmq提供的事務(wù)功能,就是生產(chǎn)者發(fā)送數(shù)據(jù)之前開啟rabbitmq事務(wù)(channel.txSelect),然后發(fā)送消息,如果消息沒有成功被rabbitmq接收到,那么生產(chǎn)者會收到異常報錯,此時就可以回滾事務(wù)(channel.txRollback),然后重試發(fā)送消息;如果收到了消息,那么可以提交事務(wù)(channel.txCommit)。但是問題是,rabbitmq事務(wù)機(jī)制一搞,基本上吞吐量會下來,因?yàn)樘男阅堋?/p>
所以一般來說,如果你要確保說寫rabbitmq的消息別丟,可以開啟confirm模式,在生產(chǎn)者那里設(shè)置開啟confirm模式之后,你每次寫的消息都會分配一個唯一的id,然后如果寫入了rabbitmq中,rabbitmq會給你回傳一個ack消息,告訴你說這個消息ok了。如果rabbitmq沒能處理這個消息,會回調(diào)你一個nack接口,告訴你這個消息接收失敗,你可以重試。而且你可以結(jié)合這個機(jī)制自己在內(nèi)存里維護(hù)每個消息id的狀態(tài),如果超過一定時間還沒接收到這個消息的回調(diào),那么你可以重發(fā)。
事務(wù)機(jī)制和cnofirm機(jī)制最大的不同在于,事務(wù)機(jī)制是同步的,你提交一個事務(wù)之后會阻塞在那兒,但是confirm機(jī)制是異步的,你發(fā)送個消息之后就可以發(fā)送下一個消息,然后那個消息rabbitmq接收了之后會異步回調(diào)你一個接口通知你這個消息接收到了。
所以一般在生產(chǎn)者這塊避免數(shù)據(jù)丟失,都是用confirm機(jī)制的。
2)rabbitmq弄丟了數(shù)據(jù)
就是rabbitmq自己弄丟了數(shù)據(jù),這個你必須開啟rabbitmq的持久化,就是消息寫入之后會持久化到磁盤,哪怕是rabbitmq自己掛了,恢復(fù)之后會自動讀取之前存儲的數(shù)據(jù),一般數(shù)據(jù)不會丟。除非極其罕見的是,rabbitmq還沒持久化,自己就掛了,可能導(dǎo)致少量數(shù)據(jù)會丟失的,但是這個概率較小。
設(shè)置持久化有兩個步驟,第一個是創(chuàng)建queue的時候?qū)⑵湓O(shè)置為持久化的,這樣就可以保證rabbitmq持久化queue的元數(shù)據(jù),但是不會持久化queue里的數(shù)據(jù);第二個是發(fā)送消息的時候?qū)⑾⒌膁eliveryMode設(shè)置為2,就是將消息設(shè)置為持久化的,此時rabbitmq就會將消息持久化到磁盤上去。必須要同時設(shè)置這兩個持久化才行,rabbitmq哪怕是掛了,再次重啟,也會從磁盤上重啟恢復(fù)queue,恢復(fù)這個queue里的數(shù)據(jù)。
而且持久化可以跟生產(chǎn)者那邊的confirm機(jī)制配合起來,只有消息被持久化到磁盤之后,才會通知生產(chǎn)者ack了,所以哪怕是在持久化到磁盤之前,rabbitmq掛了,數(shù)據(jù)丟了,生產(chǎn)者收不到ack,你也是可以自己重發(fā)的。
哪怕是你給rabbitmq開啟了持久化機(jī)制,也有一種可能,就是這個消息寫到了rabbitmq中,但是還沒來得及持久化到磁盤上,結(jié)果不巧,此時rabbitmq掛了,就會導(dǎo)致內(nèi)存里的一點(diǎn)點(diǎn)數(shù)據(jù)會丟失。
3)消費(fèi)端弄丟了數(shù)據(jù)
rabbitmq如果丟失了數(shù)據(jù),主要是因?yàn)槟阆M(fèi)的時候,剛消費(fèi)到,還沒處理,結(jié)果進(jìn)程掛了,比如重啟了,那么就尷尬了,rabbitmq認(rèn)為你都消費(fèi)了,這數(shù)據(jù)就丟了。
這個時候得用rabbitmq提供的ack機(jī)制,簡單來說,就是你關(guān)閉rabbitmq自動ack,可以通過一個api來調(diào)用就行,然后每次你自己代碼里確保處理完的時候,再程序里ack一把。這樣的話,如果你還沒處理完,不就沒有ack?那rabbitmq就認(rèn)為你還沒處理完,這個時候rabbitmq會把這個消費(fèi)分配給別的consumer去處理,消息是不會丟的。
感謝各位的閱讀,以上就是“rabbitmq 如何處理消息丟失的問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對rabbitmq 如何處理消息丟失的問題這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!