# (一)概述 {#一-概述}
今天是国考出准考证的时间,刚好女朋友也要报名了这次考试,作为合格的男朋友当然是要在第一时间将准考证信息下载下来。结果到了半夜12点之后,整个官网一直处于无法连接、502、503、接口报错等各种问题。到了凌晨1点才把准考证下载下来。作为程序员自然要好好分析下这一个小时官网究竟发生了什么事情。
# (二)事情回顾 {#二-事情回顾}
再12点准点网站开放的时候,已经很明显能感觉到页面的响应速度变得特别慢,接着出现了第一条错误信息:服务器繁忙,请您稍后再试:
随着几次刷新之后,进到了第一个系统页面,这里原本应该可以获取到的考试信息显示无法获取:
随着几次刷新后,页面也不见了,直接弹出nginx的502网关错误
接着还是nginx的报错,503 Service Temporarily Unavailable
最后就是在502和503之间来回跳跃,偶尔出来一次页面,整整一个小时。
# (三)知识储备 {#三-知识储备}
首先复习一下所有状态码表达。Http状态码是表示Http响应状态的数字代码,由三位数字组成,第一个数字代表了响应的总体状态。
1XX:指定客户端应相应的某些动作,代表请求已被接受,需要继续处理。一般来讲很少出现该响应。
2XX:代表请求成功被服务器接收,并响应。
3XX:代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向。
4XX:表示客户端请求错误。代表了客户端看起来可能发生了错误,妨碍了服务器的处理。最常见的404状态码。
5XX:代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
其中502表示作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503表示由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
# (四)问题分析 {#四-问题分析}
以今年国考的规模来看,12点准时进入网页的人是过万的,因此大流量是打垮系统的主要原因。其实经历过以前的12306抢票或者学校抢课的朋友们肯定都太熟悉这种感觉了,基本上系统一开放就是半死的状态。
首先进入网站之后最先出现的是"服务器繁忙,请您稍后尝试"这条报错,说明此时的请求已经从客户端经过nginx打到了服务器端。而服务器端是做了访问量的限流,因此返回了服务器繁忙这条信息。因为当时也没看接口响应的情况,大概猜测是如此。
接着出现了未获取到考试信息这种报错,这种情况很有可能是已经进入了接口内部,但是接口在查询后台数据库时由于并发量太大导致超时等原因无法匹配到数据库信息。
接着报错变成了502 Bad Gateway。很明显此时的报错已经从应用来到了Nginx代理机器上。最开始Nginx还能把请求反向代理给应用服务器,而随着程序执行时间超过了Nginx设定的等待时间,越来越多的请求被堵塞在Nginx上,直接导致502的产生。
然后就是503 Service Temporarily Unavailable,服务暂时不可用,说明此时请求带给nginx和服务器的压力已经达到了服务器负载的上限。当然也有可能是Nginx上做了单ip访问次数限制,这点只是猜测。
# (五)解决思路 {#五-解决思路}
这种大流量、高并发下解决系统卡死的最有效方案就是加资源,做降级,利用缓存,极致优化请求。以淘宝双十一为例,每年双十一是真正做到了将性能压榨到极限。淘宝在阿里云的支撑下实现了资源的可扩展性,因此到了双十一的时候首先要做的就是大量加服务器资源,既然一台服务器撑不住,那就五台、十台、一百台。
第二点是降级,将部分暂时可暂停的服务全部降级,你可以发现双十一高峰期的时候,阿里的很多功能是没法使用的,这些服务已经全部被暂时降级了。
第三点是利用缓存,参加双十一的商品信息在双十一之前的一段时间内是无法再修改的,原因就是这些数据将被合理地放进缓存中,并被提前预热。
第四点是机制优化缓存,这点主要是从代码层面,将耗时、多余的接口全部优化掉,做到不会产生无用的请求出来。
# (六)总结 {#六-总结}
当然,我能理解为什么抢课或者报名这种每年都会发生的系统卡顿现象不修复的原因,这些官网不会为了一次的高并发现象而提前准备百倍的服务器资源,毕竟用了一次之后这些资源就浪费了。再加上这些系统可能已经迭代了十几年,没人敢动里面的代码。但技术方面如果实现不了可以从产品角度缓解压力,比如以抢课为例,既然同一时间抢课服务器顶不住,那就规定年级,让每个年级在不同的时间点抢课。这样一下子服务器压力就变成了原来的1/4。
今天就聊到这里,我是鱼仔,我们下期再见。