问题描述
生产环境在导出 Excel 时出现连接超时,将数据复制到测试环境,使用本地项目测试时,能够顺利执行。
环境差异
生产环境使用 Nginx 代理接口,而本地项目没有使用,将本地启用 Nginx 之后,同样出现超时现象。
原因总结
Nginx 限制了转发 Http 请求的连接时间。
解决方案
一、修改 Nginx 转发模块的超时时间
在 Nginx 对应的转发模块下添加 proxy_read_timeout
属性。
1 | 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
)仍无响应,则依然会出现超时现象。
解决
只需在超时之前返回心态标记维持连接,前端忽略标记字符即可。