问题描述

生产环境在导出 Excel 时出现连接超时,将数据复制到测试环境,使用本地项目测试时,能够顺利执行。

环境差异

生产环境使用 Nginx 代理接口,而本地项目没有使用,将本地启用 Nginx 之后,同样出现超时现象。

原因总结

Nginx 限制了转发 Http 请求的连接时间。

解决方案

一、修改 Nginx 转发模块的超时时间

在 Nginx 对应的转发模块下添加 proxy_read_timeout  属性。

1
2
3
4
5
6
7
8
9
10
11
proxy_read_timeout 300;
### 其粒度可以控制在 location、server、http 中,优先级逐次减小,即最外层优先级最低
http {
proxy_read_timeout 10;
server {
proxy_read_timeout 60;
location / {
proxy_read_timeout 300;
}
}
}

属性说明

在实际表现中,proxy_read_timeout  的时间值为实际超时时间的一半,即假定转发模块的读取超时时间为 60s,使用 Postman 访问时的超时时间为 120s 左右。

相关属性

  • proxy_connect_timeout : 后端服务器连接的超时时间,发起握手等候响应超时时间;
  • proxy_read_timeout: 连接成功后,等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间,后端的耗时操作主要占用此时期);
  • proxy_send_timeout : 后端服务器数据回传时间,在规定时间之内后端服务器必须传完所有的数据;

二、后端采用异步任务

将耗时操作放置在  @Async  标记的方法中,返回  Future  包裹的处理结果,一旦其处理完成,则使用 SSE  推送到前端。

问题:无法避免配置超时时间属性

需要注意的是,在使用  SSE  推送时,必须定期返回响应,若超过 Nginx 的最大读取超时时间(proxy_read_timeout )仍无响应,则依然会出现超时现象。

解决

只需在超时之前返回心态标记维持连接,前端忽略标记字符即可。

评论