早上发现WEB SRV上的FCGI进程全部挂住了,查看日志才发现是访问一个外部接口的时候因为失败率比较高,导致FCGI进程都堵在接收回包上了,因为超时设了500ms,结果每个进程每秒只能处理2个请求,大量用户请求失败,所以用户不停地重试产生了滚雪球效应,后来调高进程数临时解决,后面继续梳理超时时间。
这里给我提了个醒,在写FCGI业务处理逻辑时,必须注意以下几点:
1. 梳理关键路径和非关键路径,在非关键路径失败的情况发生时,通过给假数据或提示的方式告知用户,但不影响正常业务逻辑。
2. 梳理所有外部接口正常处理平均耗时和最大耗时,通常在一定时间内保证95%的请求都能正常处理就可以了,另外考虑到网络波动,可以略长一点,但对小数据包、高请求量的接口,超时最长不要超过200ms,除非是大数据包返回的情况。
3. 但如果接口很多,比如有10个,每个接口超时都设成100ms的话,如果有几个接口有问题的话,整个业务处理逻辑最长可能要超时达500ms-1s,那进程也很有可能会挂死。所以,最好的方式是对整个业务处理有个处理时间上限,每次请求外部接口时记录耗时,请求返回后减掉耗时,一旦这个耗时减成0了,就直接返回失败,这样可以保证业务处理进程总有处理上限,不会被挂死,1s中接入能力是可评估的。