背景
需求
- 下訂單后未付款訂單24小時(shí)關(guān)閉
- 申請(qǐng)退款后72小時(shí)后 驗(yàn)證是否訂單已處理 未處理則可退款 否則撤銷(xiāo)退款
問(wèn)題描述
- serviceA 將會(huì)多實(shí)例部署蔗候,定時(shí)器時(shí)鐘亂序古戴,會(huì)導(dǎo)致重復(fù)添加退款任務(wù)无午,也會(huì)導(dǎo)致serviceA重復(fù)消費(fèi)退款任務(wù)
解決方案
- 用戶(hù)申請(qǐng)退款后枪眉,將待退款訂單存入mongo
- 設(shè)置定時(shí)器獲取mongo待退款訂單亦渗,逐個(gè)push入redis献联,由于需要保證只有一個(gè)serviceA實(shí)例添加任務(wù)巴粪,redis中使用sendIfAbsent 設(shè)置一個(gè)信號(hào)量鎖,并設(shè)置超時(shí)時(shí)間受扳,以免serviceA死掉后携龟,無(wú)法釋放鎖,以此保證單個(gè)實(shí)例生成任務(wù)勘高。
- 彈出任務(wù)多實(shí)例消費(fèi)峡蟋,未到時(shí)任務(wù)不放回隊(duì)列,等待下一次任務(wù)重新生成华望。
到時(shí)任務(wù)處理退款邏輯蕊蝗。處理邏輯時(shí)若發(fā)生異常,則設(shè)置mongodb中的異常次數(shù)字段赖舟,以此來(lái)判斷重試次數(shù)蓬戚,重試5次以上則存儲(chǔ)異常數(shù)據(jù),不在進(jìn)行重試宾抓,并且報(bào)警子漩。
退款流程.png
代碼還未抽象出來(lái)豫喧,后續(xù)會(huì)上傳github
如有人看到此文章,有更好的想法幢泼,歡迎留言