當(dāng)設(shè)計(jì)的業(yè)務(wù)流程或者功能需要調(diào)用其他接口實(shí)現(xiàn)請(qǐng)求與響應(yīng)的時(shí)候捺癞,可能由于網(wǎng)絡(luò)等原因?qū)е碌慕涌诔瑫r(shí)導(dǎo)致業(yè)務(wù)中斷或者功能反饋有誤等距淫。所以袖扛,對(duì)接口超時(shí)的知識(shí)做一個(gè)積累。
1弯蚜、接口資源(Mysql孔轴、Redis、Memcached碎捺、HTTP 接口)具備這樣一些特點(diǎn):
(1)都是網(wǎng)絡(luò)接口:網(wǎng)絡(luò)會(huì)成為影響因素
(2)這些資源的可用性路鹰,連接速度、讀取速度不可控
(3)分層模式收厨,對(duì)于調(diào)用方來(lái)說(shuō)晋柱,只明確是否能夠讀取數(shù)據(jù)、數(shù)據(jù)是否正確诵叁;對(duì)于資源提供方來(lái)說(shuō)負(fù)責(zé)具體的數(shù)據(jù)邏輯雁竞。
2、所以涉及到接口開(kāi)發(fā)時(shí)拧额,需要注意(產(chǎn)品更多的關(guān)注點(diǎn))
(1)超時(shí)機(jī)制:對(duì)于資源可能會(huì)很慢碑诉,對(duì)于應(yīng)用程序來(lái)說(shuō)彪腔,一個(gè) HTTP 接口,假如返回?cái)?shù)據(jù)需要十秒联贩,本身是不可接受的那么漫仆,所以需要一個(gè)超時(shí)機(jī)制,結(jié)束這個(gè)資源調(diào)配的進(jìn)程
(2)重試機(jī)制:假如一個(gè)資源特別重要泪幌,可以采取失敗重試。比如下單跟第三方接口確認(rèn)訂單時(shí)署照,出現(xiàn)中斷等原因?qū)е陆涌诜祷赜姓`祸泪,可以進(jìn)行重試請(qǐng)求
(3)異常處理機(jī)制:當(dāng)請(qǐng)求或者返回出現(xiàn)問(wèn)題,導(dǎo)致功能無(wú)法正確發(fā)揮效果的時(shí)候建芙,不應(yīng)該僅是簡(jiǎn)單處理為返回空值没隘,最好能明確產(chǎn)生異常的原因。同時(shí)禁荸,告知用戶(hù)該操作失敗的原因右蒲,和操作補(bǔ)償,怎么樣才讓用戶(hù)將該流程繼續(xù)赶熟。
3瑰妄、與用戶(hù)的交互(產(chǎn)品更多的關(guān)注點(diǎn))
http://naotu.baidu.com/file/51ee300b0b53b79a9a8e52ecd9a40e69?token=fa42fb62487d60fb
4、研發(fā)技術(shù)上可能可以嘗試的解決方案:
(1)增加超時(shí)時(shí)間
假設(shè)A系統(tǒng)有個(gè)方法methodA映砖,會(huì)調(diào)用B系統(tǒng)的methodB這個(gè)http接口间坐,如果mehodA不追求超快的響應(yīng)速度,那么你在調(diào)用methodB這個(gè)http接口時(shí)邑退,可以增長(zhǎng)超時(shí)時(shí)間竹宋,例如10秒超時(shí)。因?yàn)榻?jīng)常在某些時(shí)刻地技,由于網(wǎng)絡(luò)原因或者系統(tǒng)原因蜈七,調(diào)用method會(huì)超時(shí)的。
(2)嘗試多調(diào)用一次
如果第一次調(diào)用methodB超時(shí)了莫矗,那么你可以嘗試多調(diào)用一次飒硅。當(dāng)然前提是,methodA不追求超快的響應(yīng)時(shí)間趣苏。
(3)使用待處理隊(duì)列
如果methodA需要很快的響應(yīng)速度狡相,那么當(dāng)調(diào)用methodB接口超時(shí)時(shí),可以使用一個(gè)隊(duì)列存儲(chǔ)本次失敗的記錄食磕,然后使用一個(gè)job每隔一段時(shí)間去掃這個(gè)隊(duì)列尽棕,看看是否有待處理的數(shù)據(jù)。
備注:如果對(duì)方系統(tǒng)掛掉了彬伦,使用待處理隊(duì)列的方式滔悉,比較合適伊诵。
(4)回滾數(shù)據(jù)
catch這個(gè)超時(shí)異常,然后記錄日志后回官,拋出這個(gè)異常曹宴,并把之前的數(shù)據(jù)回滾。讓對(duì)方的系統(tǒng)重新調(diào)用歉提。
備注:寧愿沒(méi)有數(shù)據(jù)笛坦,也不要存儲(chǔ)臟數(shù)據(jù)。
(5)使用異步機(jī)制
如果你的業(yè)務(wù)方法中苔巨,需要調(diào)用對(duì)方的http接口版扩,如果這個(gè)http接口不影響主流程的,那么可以使用一個(gè)線(xiàn)程侄泽,異步調(diào)用對(duì)方的http接口礁芦,并把超時(shí)時(shí)間設(shè)置長(zhǎng)一些。由于使用了異步悼尾,主流程會(huì)立刻繼續(xù)走的柿扣。
(6)問(wèn)題:調(diào)用第三方支付接口響應(yīng)時(shí)間超過(guò)10秒,導(dǎo)致大量線(xiàn)上訂單因?yàn)槌瑫r(shí)失敗闺魏,該接口是實(shí)時(shí)返回結(jié)果的未状,而且不是一直都慢,是偶爾慢舷胜。
解決方法:調(diào)用接口時(shí)設(shè)置超時(shí)時(shí)間娩践,當(dāng)接口超過(guò)9秒未返回結(jié)果,自動(dòng)將改訂單設(shè)置為處理中烹骨,然后后由定時(shí)任務(wù)調(diào)用查詢(xún)接口翻伺。
這樣就把,一個(gè)實(shí)時(shí)返回結(jié)果的接口沮焕,當(dāng)成一個(gè)異步的接口來(lái)用了吨岭,總比一大堆失敗訂單等著財(cái)務(wù)來(lái)找好。
可查看鏈接:
http://wulijun.github.io/2012/08/08/php-timeout-summary.html
http://www.reibang.com/p/8555ce285375