apache - Tomcat 服务器导致大负载管道损坏

标签 apache spring-boot tomcat

我制作了一个简单的 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/

相关文章:

apache - 如何在flume中设置日志文件名

java - 管理多模块项目

html - 访问本地网络上的 HTML 页面

spring - 使用来自不同数据库的 bean hibernate DuplicateMappingException

apache - 找不到基于名称的虚拟主机 url

apache - 在 apache hadoop 中读取或复制到 hdfs 时出现校验和异常

php - Laravel 权限在 storage/meta/services.json 中被拒绝

java - JPA 将 native 查询结果映射到非实体 DTO

java - spring-boot-starter-web 和 spring-boot-starter-webflux 不能一起工作吗?

java - 如何设置 FormAuthenticator 属性