最近有個(gè)項(xiàng)目需要本地處理之后,然后調(diào)用第三方接口,本來(lái)開(kāi)始覺(jué)得很簡(jiǎn)單得事情,不就是調(diào)用第三方接口嗎?但是卻一波三折。
初版
首先有了下面的第一版的設(shè)計(jì)。
這個(gè)設(shè)計(jì)很簡(jiǎn)單,也是最容易想到的。主要有下面幾步
1、本地處理;
2、調(diào)用第三方接口;
3、本地日志打印,包括是否調(diào)用成功及失敗原因等;
看似很簡(jiǎn)單的過(guò)程,卻在線上出了問(wèn)題,我們說(shuō)看一個(gè)功能是否穩(wěn)定,不是看99.9%的正常,而是看0.01%的失敗。沒(méi)錯(cuò),線上報(bào)錯(cuò)了,問(wèn)題出現(xiàn)在調(diào)用第三方接口的時(shí)候由于網(wǎng)絡(luò)問(wèn)題,超時(shí)了,真尷尬,
分析這個(gè)方案有以下幾個(gè)不足,
1、沒(méi)有重試功能;
2、調(diào)用接口記錄未持久化;
為此在第一版的基礎(chǔ)上做了修改;
優(yōu)化版本
優(yōu)化版本考慮了上面的兩個(gè)不足之處,對(duì)調(diào)用第三方接口進(jìn)行了重試,且把調(diào)用記錄寫(xiě)進(jìn)本地表;
改進(jìn)方案有幾個(gè)需要注意的地方,
1、重試,由于是第一次調(diào)用失敗便要重試,要注意重試的次數(shù),可以在系統(tǒng)中設(shè)計(jì)一個(gè)最大重試次數(shù)(比如5次),超過(guò)最大重試次數(shù)不再重試,每次的重試可以有一定的間隔,可以采用當(dāng)前線程睡眠的方式,睡眠的時(shí)間可以隨著重試次數(shù)增大二增加;
2、記錄調(diào)用日志,這里調(diào)用日志記錄在mysql中,mysql的表結(jié)構(gòu)可參考,
另外,由于包含重試,對(duì)于調(diào)用日志的話,考慮是否要區(qū)分重試日志;還有一點(diǎn)就是是否需要一個(gè)最終的調(diào)用結(jié)果。
改進(jìn)版上線后,返現(xiàn)確實(shí)線上調(diào)用第三方接口失敗的情況很少了,但是還是存在失敗的情況,由于已經(jīng)把調(diào)用記錄保存在了mysql中,為此針對(duì)重試仍然失敗的情況可以單啟一個(gè)定時(shí)任務(wù),
好了,有了定時(shí)任務(wù),針對(duì)調(diào)用失敗的情況可以進(jìn)行再次執(zhí)行,那么成功的幾率就很高了,換而言之失敗的情況很少了。
如果還是有失敗的情況,那么應(yīng)該從調(diào)用方式、第三方接口是否正常等方面去排查,程序方面很難有所改進(jìn)了。
其實(shí)針對(duì)重試這塊還可以直接使用定時(shí),這種情況對(duì)于實(shí)時(shí)性要求不高的情況完全可以,也就是下面的樣子,
這就是直接定時(shí)掃描調(diào)用記錄表,定時(shí)執(zhí)行。不過(guò),仍然會(huì)出現(xiàn)一直失敗的情況,那就陷入死循環(huán)了,可以針對(duì)掃描范圍作一個(gè)限制,比如最近7天的記錄,超過(guò)這個(gè)時(shí)間即使失敗也不會(huì)再執(zhí)行定時(shí)重調(diào)了。
除了在程序中作重試外還有其他方案嗎?
最優(yōu)版本嗎
日常的開(kāi)發(fā)中肯定都用過(guò)MQ,用來(lái)生產(chǎn)及消費(fèi)消息,那么這里的重試便可以使用MQ,把第一次調(diào)用第三方接口失敗作為消息投遞到MQ,再重啟另外的服務(wù)去消費(fèi)MQ,在消費(fèi)者中進(jìn)行重試。
這種方案適合調(diào)用第三方接口較多,而且對(duì)主程序性能要求較高的情況,把重試從主程序中分離開(kāi),可以避免重試成為影響程序性能的瓶頸。
這個(gè)方案的優(yōu)點(diǎn)是將重試和主程序分割開(kāi)來(lái),起到了解耦的作用??赡苡胁簧贂?huì)問(wèn)消費(fèi)MQ如果第一次執(zhí)行失敗怎么辦,MQ已經(jīng)考慮到這個(gè)問(wèn)題了,MQ可以重發(fā),感興趣的小伙伴可以了解下哦。
?
總結(jié),通過(guò)上邊的幾種方案,可以看到調(diào)用第三方接口看似簡(jiǎn)單,其實(shí)內(nèi)含玄機(jī)。到底采用哪種方案要根據(jù)實(shí)際情況而定,不要因?yàn)橄胧褂檬裁醇夹g(shù)而去采取相應(yīng)的方案,只有適合的才是最好的??梢詮南旅鎺讉€(gè)方面考慮,
1、系統(tǒng)性能;
2、實(shí)時(shí)性;
3、系統(tǒng)調(diào)用量;
好了,讀到這里的小伙伴,不知道對(duì)于調(diào)用第三方接口,有沒(méi)有其他的想法,歡迎交流哦。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-462516.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-462516.html
到了這里,關(guān)于僅僅是調(diào)用第三方接口那么簡(jiǎn)單嗎?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!