背景:生产环境功能测验证时大量报错504和502,准入网关假死
原因:
在压测过程中,使用了过期的cookie导致访问应用接口鉴权失败,访问接口走协议里约统一认证里面去了。里约统一认证压测多次,准入网关假死,报错504与502
排障过程:
1。通过产研初步定位,问题确认是网关配置问题,使用错误的cookie请求会去查询redis数据库,对接入网关配置文件进行修改,排查目前有出现接入请求到准入网关的时候没有负载均衡的情况,通过修改网关配置文件后复测重复压测依旧发现修改不成功,依旧会出现假死
2.拉通网关人员上会,排查出是认证过程中会走协议到wwlocal identity init onGo ,此函数会报错,经过分析排查此函数存在逻辑BUG,发现请求会重复执行wwlocal identity init规则onGo函数来res.writeHead.导致准入网关出现Crash后经产研人员修复BUG,定位到问题
切入点:RIO报错日志Cannot set headers after they are sent to the client,造成网关worker重启,回溯栈在认证规则函数onGo里,里面先执行res.writeHead(),后执行res.end(),其中res.end()即是“sent to the client”。
外围代码发现有一处if内调用onGo,if之后缺少else,再次调用onGo的,会产生先调用res.end(),再调用res.writeHead()的时序,加上else后压测情况恢复,不再遇到网关假死情况。
无else
有else