【问题标题】:WebClient prematurely closed DURING responseWebClient 在响应期间过早关闭
【发布时间】:2021-11-12 05:22:02
【问题描述】:

我正在使用 Spring webclient 连接到 netty webflux 服务器。

我在消费者空闲 20-30 分钟后收到此错误。

  • Webflux 服务器正在 AWS EC2 中运行
  • 由部署在 AWS EKS-EC2 中的 Spring 云网关前端
  • AWS ELB 作为 Spring 云网关的入口负载均衡器
  • 以前,由于 AWS ELB 空闲超时配置,我曾经在 webflux 服务器上超时。所以现在 webflux 服务每 20 秒向客户端发送一次心跳消息

是因为连接从服务器端关闭还是问题出在客户端?

reactor.netty.http.client.PrematureCloseException:
    Connection prematurely closed DURING response

Suppressed:
reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
    Error has been observed at the following site(s):
            |_ checkpoint ? Body from GET https://*** [DefaultClientResponse]

【问题讨论】:

  • 我在 20-30 分钟后收到此错误

标签: spring-webflux spring-webclient


【解决方案1】:

这一般是服务器端关闭空闲连接造成的。

在客户端,您可以通过在ConnectionProvider 构建器上调用maxIdleTime 方法来配置空闲连接的使用时间。示例取自 Connection Pool Reference Docs

ConnectionProvider.builder("custom")
                .maxConnections(50)
                .maxIdleTime(Duration.ofSeconds(20))
                .maxLifeTime(Duration.ofSeconds(60))
                .build()

maxIdleTime - 此连接在连接池中保持空闲的最长时间(分辨率:毫秒)。默认不指定maxIdleTime。

maxLifeTime - 此连接保持活动的最长时间(分辨率:毫秒)。默认不指定 maxLifeTime。

reference docs 中的此注释对于您看到的目标服务器在客户端之前关闭连接的问题特别关键。

在配置 maxIdleTime 时,应考虑目标服务器上的空闲超时配置。选择等于或小于目标服务器上的配置。这样做可以减少目标服务器关闭连接导致的 I/O 问题。

maxIdleTime JavaDocs

maxLifeTime Javadocs

【讨论】:

  • 嗨,Michael,我不确定这与 IdleTime out 有什么关系。我在 20-30 分钟后看到这种断开连接。并且服务器正在发送心跳消息响应,哪个客户端正在接收它,直到发生此断开连接问题。
  • 您知道远程服务器上的空闲连接超时或生命周期连接超时设置是什么吗?
  • 这里涉及到多个层 Webclient -> AWS R53-> ELB LoadBalancer -> SpringCloudGateway -> Webflux service。我的怀疑是 AWS ELB 负载均衡器可能在这里发挥了作用......在我的本地环境中,如果我直接通过 spring 云网关,从来没有遇到过超时。但不知道那是什么配置..我已经修复了 webflux 服务,通过每 20 秒向客户端发送一次心跳消息......几次,有一段时间,webflux 服务不会有任何数据流,但仍然想要连接到得到维护。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2019-07-24
  • 2012-08-15
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多