公司建設(shè)官方網(wǎng)站需要多少錢做運(yùn)營(yíng)的具體做什么
RocketMQ重復(fù)消費(fèi)的癥狀以及解決方案
生產(chǎn)消息時(shí)重復(fù)
癥狀
當(dāng)一條消息已被成功發(fā)送到 消費(fèi)者 并完成持久化,此時(shí)出現(xiàn)了網(wǎng)絡(luò)閃斷或者客戶端宕機(jī),導(dǎo)致服務(wù)端對(duì)客戶端應(yīng)答失敗。 如果此時(shí) 生產(chǎn)者 意識(shí)到消息發(fā)送失敗并嘗試再次發(fā)送消息,消費(fèi)者 后續(xù)會(huì)收到兩條內(nèi)容相同并且 ID 也相同的消息。
方案
- 避免消費(fèi)重復(fù)產(chǎn)生,找到原因,并做代碼的限制。
- 消費(fèi)數(shù)據(jù)時(shí)利用Java代碼做ID的重復(fù)校驗(yàn),重復(fù)則放棄,并返回異常信息。也可以考慮針對(duì)數(shù)據(jù)庫有條件的插入語句,限制重復(fù)插入。
- 消費(fèi)數(shù)據(jù)時(shí),通過訂閱的記錄和消費(fèi)的結(jié)果來判斷,此消息是否重復(fù)訂閱過,如果重復(fù)訂閱,則不在數(shù)據(jù)庫中插入數(shù)據(jù)。
消費(fèi)消息時(shí)重復(fù)
癥狀
消息已投遞到 消費(fèi)者 并完成業(yè)務(wù)處理,當(dāng) 消費(fèi)者 給 MQ 反饋應(yīng)答的時(shí)候網(wǎng)絡(luò)閃斷。 為了保證消息至少被消費(fèi)一次,消息隊(duì)列 MQ 的服務(wù)端將在網(wǎng)絡(luò)恢復(fù)后再次嘗試投遞之前已被處理過的消息,消費(fèi)者 后續(xù)會(huì)收到兩條內(nèi)容相同并且 ID 也相同的消息。
方案
- 消費(fèi)數(shù)據(jù)時(shí)利用Java代碼做ID的重復(fù)校驗(yàn),重復(fù)則放棄,并返回異常信息。也可以考慮針對(duì)數(shù)據(jù)庫有條件的插入語句,限制重復(fù)插入。
消費(fèi)時(shí)出現(xiàn)異常
癥狀
消息已投遞到 消費(fèi)者 并完成 業(yè)務(wù)A 處理,但是 業(yè)務(wù)B 處理時(shí),發(fā)生異常,造成該條消息會(huì)標(biāo)記 消費(fèi)失敗 ,那么為了保證消息至少被消費(fèi)一次,該條消息會(huì)消費(fèi)多次,直到達(dá)到消費(fèi)16次,會(huì)自動(dòng)放入死信隊(duì)列。
方案
- 分布式事務(wù)鎖(一般是zookeeper和redis搭建)