服务页面卡,接口长时间无响应出错

问题:我们的服务突然之间页面打开很卡,接口长时间无响应,最终返回500 internal error,还有一个错误信息提示跨域。

背景:随着Data Factory的推广,越来越多的小伙伴开始使用、接入我们的服务。

事发突然也不突然,在正式推广会前我要确保我们的功能可用,不至于当场打脸。好嘛,这时候发现页面打开有点卡,不过当时不以为然,完全没放心上。着急验证我们的各业务模块功能可用,这时候发现请求长时间无响应。

错误第一点:页面打开很卡,却未引起任何警觉。

以下是发现服务请求长时间无响应,依次想到的、做过的排查,有很多问题,也有很多疏忽。

前端控制台展示的错误信息:500 (INTERNAL SERVER ERROR)    No 'Access-Control-Allow-Origin' header is present on the requested resource

第一步:拉仓库最新master代码,本地起服务,调试看详细错误信息。

结论:本地起服务页面打开正常,接口请求都正常返回结果。所以我认定这个500的internal server error其实是不存在的,就是跨域的问题。

第二步:跨域的问题我不擅长,打算找前端搞定,仔细读了错误提示,明确说因为500 internal server error 导致,还是找前端确认了下,前端也同意确实是接口出错导致的错误。

结论:我和前端确认是由于后端服务报错导致的,跟跨域没关系。

第三步:此时我就很困惑了,明明接口都没问题,同一份代码本地起服务一切正常。为何会有这种后端服务报错?本地看不到报错,那我就去服务器上看报错吧

结论:查看服务器端log信息。

第四步:登录服务器,找到对应log文件。页面发起请求,服务器上实时看log。此时发现我们业务中有一步接口302重定向的时候有问题,这个请求一直没有返回,我们的代码中对请求返回的status_code校验是否200,如果通过才会再进行下一步。此时一直重定向这里一直无返回报错。

结论:请求长时间无响应出错了,log只有assert校验出错,并没有其他内容可看。

第五步:以为是我们请求的服务器响应慢,在请求返回前就校验失败,所以我在代码中调大了sleep的时间,可是发现请求仍然是一直没有返回,直到返回500之后,才会同一时间进来N多请求,在这些请求里我清楚的看到了302的正确返回,我开始有点怀疑,我试着把sleep时间调回去发现也是一样,就是说我们的请求一直是阻塞的,这个没处理完其他请求都处理不了,一旦出错,立马其他请求都瞬间处理起来了。

结论:发现我们的服务处理是单进程阻塞的,所以一直拿不到302重定向的返回。

第六步:此时我才想起来去看一眼我们的服务进程情况,ps一下,真的如我所猜测的就只有一个进程。我们是flask的服务,原先是单进程阻塞的,后面使用tornado并发起50个进程解决了此问题,现在为何失效了?翻了下仓库中的代码发现服务启动的进程数被改成1了。。。

此时有个问题:为什么本地起服务运行的时候302没问题?因为我本地起服务的时候,是我本地的机器发请求到我们的服务器做处理返回给我。可是在服务器上跑的时候其实是自己发请求自己处理,再返回,单进程的服务根本搞不来。

后话:因为我们的服务属于测试工具,用的人少无需考虑并发,并且我们的服务启动时开了50个进程,所以打开页面不应出现卡的情况。我在最一开始就应该有所警觉的。

我勒个去。。。虽然小伙伴是误改的,但是我陷入了思考。

权限放开是为了大家更高效,但是真的需要如此open吗?merge master由专人负责是否会更合适?

我个人觉得是有必要专人负责的,不过专人的职责在与检查代码有无改动公共模块,以及改动的有无问题。

你可能感兴趣的:(服务页面卡,接口长时间无响应出错)