Osheep

时光不回头,当下最重要。

POI导出大批量数据出现Broken pipe

大批量数据导出时,系统动不动就卡死?

问题描述:

  1. 出现在excel导入的时候
  2. 线上有问题,本地数量少时不可重现
  3. 数据量少的时候没问题,POI excel基本超过10000行就出现问题
  4. 查看日志,提示Broken pipe

《POI导出大批量数据出现Broken pipe》

问题分析:

  1. 看日志,应该是失去客户端连接。猜测应该是导入操作的http请求超时。
  2. 在导入方法添加日志,发现后台导入逻辑还在执行时候ajax已经返回超时了。猜测导入操作的ajax时长设置有问题。
  3. 查看代码,导入操作$.ajax({})提交,设置timeout:0,测试,依然超时,说明与前端无关。
  4. 在后端相关代码未设置任务时间的超时,那原因可能出现在请求代理层,查看nginx反向代理配置,发现以下几个时间配置项
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;

通过修改nginx代理配置,问题得以解决。
最终配置如下:

location ~ {
    proxy_pass http://opr_admin_serve;
    proxy_redirect off;
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 200m;
    client_body_buffer_size 128k;
    proxy_send_timeout 1200s;
    # nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭
    proxy_read_timeout 1200s;
    # nginx与upstream server的连接超时时间
    proxy_connect_timeout 1200s;
    # 发送数据至客户端超时, 默认60s, 如果连续的60s内客户端没有收到1个字节, 连接关闭
    send_timeout 1200s;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
}
点赞