我制作了一个简单的 spring-boot 应用程序,它为所有请求返回静态 json 响应。
当应用程序收到具有较大负载(~5mb json,1 TP)的请求时,客户端会收到以下错误:
java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
我已尝试增加所有可能的限制 - 这是我的 tomcat 设置:
spring.http.multipart.max-file-size=524288000
spring.http.multipart.max-request-size=524288000
spring.http.multipart.enabled=true
server.max-http-post-size=10000000
server.connection-timeout=30000
server.tomcat.max-connections=15000
server.tomcat.max-http-post-size=524288000
server.tomcat.accept-count=10000
server.tomcat.max-threads=200
server.tomcat.min-spare-threads=200
我该怎么做才能用一个 Controller 制作这个简单的 spring boot,以成功处理此类有效负载?
这个 springboot 应用程序和发送大有效负载的客户端在具有 16gb ram 的 8 核机器上运行。所以资源应该不是问题。
最佳答案
这是因为 Controller 在不使用请求正文的情况下返回响应。 所以服务器一收到请求就关闭连接,而不消耗完整的请求体。客户端还没有完成发送请求,服务器在此之前关闭了连接。
解决方法: 1.阅读代码中的完整请求正文 2. 将 tomcat 的 maxSwallowSize 设置为更高的值(默认值:2mb) server.tomcat.max-swallow-size=10MB
关于apache - Tomcat 服务器导致大负载管道损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55740490/