問題:我們的服務(wù)突然之間頁面打開很卡甘改,接口長時(shí)間無響應(yīng),最終返回500 internal error灭抑,還有一個(gè)錯(cuò)誤信息提示跨域十艾。
背景:隨著Data Factory的推廣,越來越多的小伙伴開始使用名挥、接入我們的服務(wù)疟羹。
事發(fā)突然也不突然,在正式推廣會前我要確保我們的功能可用禀倔,不至于當(dāng)場打臉榄融。好嘛,這時(shí)候發(fā)現(xiàn)頁面打開有點(diǎn)卡救湖,不過當(dāng)時(shí)不以為然愧杯,完全沒放心上。著急驗(yàn)證我們的各業(yè)務(wù)模塊功能可用鞋既,這時(shí)候發(fā)現(xiàn)請求長時(shí)間無響應(yīng)力九。
錯(cuò)誤第一點(diǎn):頁面打開很卡,卻未引起任何警覺邑闺。
以下是發(fā)現(xiàn)服務(wù)請求長時(shí)間無響應(yīng)跌前,依次想到的、做過的排查陡舅,有很多問題抵乓,也有很多疏忽。
前端控制臺展示的錯(cuò)誤信息:500 (INTERNAL SERVER ERROR)? ? No 'Access-Control-Allow-Origin' header is present on the requested resource
第一步:拉倉庫最新master代碼靶衍,本地起服務(wù)灾炭,調(diào)試看詳細(xì)錯(cuò)誤信息。
結(jié)論:本地起服務(wù)頁面打開正常颅眶,接口請求都正常返回結(jié)果蜈出。所以我認(rèn)定這個(gè)500的internal server error其實(shí)是不存在的,就是跨域的問題涛酗。
第二步:跨域的問題我不擅長铡原,打算找前端搞定,仔細(xì)讀了錯(cuò)誤提示商叹,明確說因?yàn)?00 internal server error 導(dǎo)致眷蜈,還是找前端確認(rèn)了下,前端也同意確實(shí)是接口出錯(cuò)導(dǎo)致的錯(cuò)誤沈自。
結(jié)論:我和前端確認(rèn)是由于后端服務(wù)報(bào)錯(cuò)導(dǎo)致的酌儒,跟跨域沒關(guān)系。
第三步:此時(shí)我就很困惑了枯途,明明接口都沒問題忌怎,同一份代碼本地起服務(wù)一切正常籍滴。為何會有這種后端服務(wù)報(bào)錯(cuò)?本地看不到報(bào)錯(cuò)榴啸,那我就去服務(wù)器上看報(bào)錯(cuò)吧
結(jié)論:查看服務(wù)器端log信息孽惰。
第四步:登錄服務(wù)器,找到對應(yīng)log文件鸥印。頁面發(fā)起請求勋功,服務(wù)器上實(shí)時(shí)看log。此時(shí)發(fā)現(xiàn)我們業(yè)務(wù)中有一步接口302重定向的時(shí)候有問題库说,這個(gè)請求一直沒有返回狂鞋,我們的代碼中對請求返回的status_code校驗(yàn)是否200,如果通過才會再進(jìn)行下一步潜的。此時(shí)一直重定向這里一直無返回報(bào)錯(cuò)骚揍。
結(jié)論:請求長時(shí)間無響應(yīng)出錯(cuò)了,log只有assert校驗(yàn)出錯(cuò)啰挪,并沒有其他內(nèi)容可看信不。
第五步:以為是我們請求的服務(wù)器響應(yīng)慢,在請求返回前就校驗(yàn)失敗亡呵,所以我在代碼中調(diào)大了sleep的時(shí)間抽活,可是發(fā)現(xiàn)請求仍然是一直沒有返回,直到返回500之后锰什,才會同一時(shí)間進(jìn)來N多請求酌壕,在這些請求里我清楚的看到了302的正確返回,我開始有點(diǎn)懷疑歇由,我試著把sleep時(shí)間調(diào)回去發(fā)現(xiàn)也是一樣,就是說我們的請求一直是阻塞的果港,這個(gè)沒處理完其他請求都處理不了沦泌,一旦出錯(cuò),立馬其他請求都瞬間處理起來了辛掠。
結(jié)論:發(fā)現(xiàn)我們的服務(wù)處理是單進(jìn)程阻塞的谢谦,所以一直拿不到302重定向的返回。
第六步:此時(shí)我才想起來去看一眼我們的服務(wù)進(jìn)程情況萝衩,ps一下回挽,真的如我所猜測的就只有一個(gè)進(jìn)程。我們是flask的服務(wù)猩谊,原先是單進(jìn)程阻塞的千劈,后面使用tornado并發(fā)起50個(gè)進(jìn)程解決了此問題,現(xiàn)在為何失效了牌捷?翻了下倉庫中的代碼發(fā)現(xiàn)服務(wù)啟動(dòng)的進(jìn)程數(shù)被改成1了墙牌。涡驮。。
此時(shí)有個(gè)問題:為什么本地起服務(wù)運(yùn)行的時(shí)候302沒問題喜滨?因?yàn)槲冶镜仄鸱?wù)的時(shí)候捉捅,是我本地的機(jī)器發(fā)請求到我們的服務(wù)器做處理返回給我∷浞纾可是在服務(wù)器上跑的時(shí)候其實(shí)是自己發(fā)請求自己處理棒口,再返回,單進(jìn)程的服務(wù)根本搞不來辜膝。
后話:因?yàn)槲覀兊姆?wù)屬于測試工具无牵,用的人少無需考慮并發(fā),并且我們的服務(wù)啟動(dòng)時(shí)開了50個(gè)進(jìn)程内舟,所以打開頁面不應(yīng)出現(xiàn)卡的情況合敦。我在最一開始就應(yīng)該有所警覺的。
我勒個(gè)去验游。充岛。。雖然小伙伴是誤改的耕蝉,但是我陷入了思考崔梗。
權(quán)限放開是為了大家更高效,但是真的需要如此open嗎垒在?merge master由專人負(fù)責(zé)是否會更合適蒜魄?
我個(gè)人覺得是有必要專人負(fù)責(zé)的,不過專人的職責(zé)在與檢查代碼有無改動(dòng)公共模塊场躯,以及改動(dòng)的有無問題谈为。