冪等函數(shù),或冪等方法在跳,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)
研究了很久的冪等性解決方案隐岛。終于實(shí)現(xiàn)了一個(gè)模型猫妙。拋磚引玉,希望各路大神指正
1聚凹、主要是基于Spring MVC的HandlerInterceptorAdapter + ResponseBodyAdvice + redis的分布式鎖割坠。?
2、冪等的請(qǐng)求妒牙。需要在請(qǐng)求中加入header參數(shù)X-REQ-IDEM-ID彼哼,并賦值UUID,用于標(biāo)記同一次請(qǐng)求
3湘今、如果同一請(qǐng)求發(fā)生競(jìng)爭(zhēng)沪羔。通過(guò)redis的nx來(lái)競(jìng)爭(zhēng)鎖。競(jìng)爭(zhēng)失敗的請(qǐng)求返回狀態(tài)碼499
4象浑、如果請(qǐng)求時(shí)蔫饰,當(dāng)前UUID狀態(tài)正在處理中,那么返回499
5愉豺、客戶端收到reponse code 為 499篓吁。則需要通過(guò)重試策略來(lái)獲得執(zhí)行結(jié)束后的值
6、對(duì)于有內(nèi)部轉(zhuǎn)發(fā)的請(qǐng)求的冪等處理方式蚪拦。因?yàn)樵趕ervlet規(guī)范中杖剪,forawrd在一個(gè)jvm里面會(huì)是由同一個(gè)線程處理。而且Spring MVC的不管內(nèi)部出現(xiàn)幾次forward(有人為forward,也有controller? 層向上拋異常的error也會(huì)有forward到默認(rèn)的/error)驰贷,會(huì)在內(nèi)部跳轉(zhuǎn)的結(jié)束后盛嘿,調(diào)用ResponseBodyAdvice。所以只需要關(guān)心ResponseBodyAdvice的內(nèi)部實(shí)現(xiàn)即可
The Container Provider should ensure that the dispatch of the request to a target servlet occurs in the same thread of the same JVM as the original request.
7括袒、代碼和使用手冊(cè)參考:https://github.com/amu007/springcloud-idempotent-starter