Java Web工程,Nginx连接超时,504 解决方案

第一次写博客,非喜勿喷哦大笑


最近在做库存对比工具,将对比结果导出csv下载,这个对比过程非常长,数据量很大,导致服务器一直在等待后台响应,然后504,

下面是我解决这个问题的过程,希望大家不要踩坑;

1.修改net.core.somaxconn的值;

此解决方案是在阿里云帮助文档看见的;

想连接很多关于net.core.somaxconn 的信息,转此处  

https://blog.csdn.net/mawming/article/details/51952411

net.core.somaxconn是Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。 

解决方法:默认的net.core.somaxconn的值为128,执行sysctl -w net.core.somaxconn=1024更改它的值,重启tomcat,看问题是否解决,如还未解决,接着往下看;

2.优化后端导出方案;

 a.后端导出数据,由多步变一步,尽量压缩执行时间;

 b.更改导出数据方式,由一次性执行完成后生成文件,返回流给浏览器的方式变为持续性的写出流到浏览器;


b方案的实现:

首先感谢这位大佬提供的小工具,非常感谢;

https://blog.csdn.net/pipi_7/article/details/70141054

由于大佬提供了工具并未提供demo,所以我摸索了会儿基于他实现了我想要的结果;

大佬的博客里面这个工具的使用已经说得很明白了,我只提供我代码部分:


0.在Controller里初始化工具类对象,然后传入业务层进行数据操作;


1.工具类初始化需要传入响应对象,表头字段的Map(与封装对象字段对应起),文件名,封装对象字节码对象;


2.这是封装类


3.业务层代码实现;

a.定义一个集合,封装数据对象(由于我一次对比会产生多个导出对象,所以定义一个集合,你们可以根据实际情况来定义)


b.添加数据对象到集合;


c.一次循环完成,导出数据;



b.所有数据导出完成(我是for循环完成后),调用工具类close方法,关流;



下面是结果,不会出现504了,等待后台所有数据对比完成后,会自动下载csv文件;



下载完成;





完美解决!

感谢:

https://blog.csdn.net/mawming/article/details/51952411

https://blog.csdn.net/pipi_7/article/details/70141054