Netty HttpClient - 响应超时 vs 读取超时

9

HttpClient 提供了各种“超时”设置,其中两个会稍微令我迷惑:

  • responseTimeout: 发送请求后接收响应所需的时间
  • ReadTimeoutHandler: 在一定时间内没有读取到任何数据时引发ReadTimeoutException异常

请问有人能够解释它们之间的关键区别吗?


通用场景-使用Spring React Web Client发出调用,此Web Client在底层使用HttpClient

  1. 与远程服务器建立连接>>> 我们在这里利用ChannelOption.CONNECT_TIMEOUT_MILLIS
  2. TLS握手>>> 我们在这里使用ReadTimeoutHandler,对吗?
  3. 发送请求
  4. ...等待...
  5. 接收响应>>> 在这里,哪个“超时”具有优先权:response还是read?
2个回答

3

3
如果您使用WebFlux和Netty,则httpClient应该是Netty的httpClient。您看过那里吗?https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html 1. 连接超时 -> 如果由于任何原因无法连接到远程服务器,将使用此超时时间。 2. TLS握手,请检查:reactor.netty.http.client.HttpClient#secure():如果未进行其他配置,Netty将假定握手的超时时间为10秒钟。如果要定义另一个超时时间,请使用reactor.netty.tcp.sslHandshakeTimeouthttps://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html#secure-- 3. 连接现在已建立,并且您发送了请求。通过使用ReadTimeoutHandler,您可以定义等待多长时间直到接收到连接上的数据。这可以是例如一次性接收整个响应或字节(如果响应是流式传输的)。httpClient中的responseTimeout也是如此。两者都使用给定的timeOut设置创建TcpClient。使用ReadTimeoutHandler的好处是,当超时发生时,您会得到一个回调执行您定义的逻辑。

由于我使用了.secure(sslContextSpec -> sslContextSpec.sslContext(...),我发现只有.handshakeTimeout(..),说实话这更加令人困惑了...在https://github.com/reactor/reactor-netty/issues/1159上查看 - 我的理解是,应该是ReadTimeoutHandler负责握手超时,你能否在这里详细说明一下? - asceta
我正在使用tcpClient.doOnConnected(conn -> conn .addHandlerLast(new ReadTimeoutHandler(readTimeout, TimeUnit.MILLISECONDS))),你所说的callback是指提供创建自定义ReadTimeoutHandler的选项吗? - asceta
2
我不建议使用ReadTimeoutHandler,原因在https://github.com/reactor/reactor-netty/issues/1159中。 - Violeta Georgieva
@VioletaGeorgieva,你能解释一下这个吗? 即使不处理HTTP请求,它们仍然适用。例如,它们可能会导致连接池中的连接被关闭,即使在短短的一瞬间内,另一个请求可能仍然可以使用该连接。 - Daanish Sarguru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接