image
NightSnow

池浅王八多 遍地是大哥

记MVC Controller 中请求参数偶现丢失的问题排查

NightSnow    2020-11-07 14:39

起因公司项目部署沙箱环境后由于环境内存有限,频发请求链接上携带的参数在 java 端Controller 方法中丢失为空,引起各种逻辑异常。

        调用链路 :
        浏览器 --> nodeJS --> Java   
        nodeJS 和 Java 分别部署在docker 中。
排查步骤:
1. 初始考虑是镜像或者防火墙原因:
        排查结果: 容器访问日志中抓取的结果会体现请求体个别的比较小。但是未能明确请求体和实际出现问题的请求是一次请求。所以这个未能体现出问题。
2. 加大运行内存,增加运行实例。 
        效果: 发生频率明细降低。非压测情况难出现。但是还是会偶发。 未能根本解决。
3. 网络上类似状况搜索: 原文 https://my.oschina.net/forever9999/blog/4297946
       原因:
                一旦系统中存在异步线程,在服务器高负荷状态下,异步线程可能发生延迟,导致响应已经返回了,但是异步线程仍然可以读取活动中的请求参数。但请求对象是同一个对象复用的,在调用getParameter(String)之类的方法后,现存的下一个请求(或者正在执行的请求)中的didQueryParameters变量就会被置为true,如果该请求正在被包装处理,那么就会在后续的处理过程中,因为变量值发生变化而被认为请求参数已经无法读取,从而发生异常。 解决方法也很简单,从异步线程中去掉getParameter的直接调用即可恢复正常。
按照3中的方向排查多日,最终偶然情况下部门老大发现问题所在!>> 修改>> 验证>> 解决
        附我们原来影响的代码:
        
Last Modified: 2020-11-07 14:45
Views: 1.5K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment