当客户端使用 readTimeout 关闭连接时,服务器上会发生什么情况



当客户端使用 readTimeout 关闭与 API 的连接时,服务器上会发生什么情况。请求的执行是完成还是在发生超时后立即中断,或者执行将完成并且响应流被服务器应该发送给用户的响应堵塞

超时是一种关闭连接的不整洁方式 - 当您的连接端超时时,您很有可能无法告诉另一端您已超时并且正在关闭连接。也就是说,连接并没有通过双方的协调行动正式关闭,只是一方决定将其视为死亡。

解决此问题的方法是连接两端都有超时 - 如果一端超时,另一端最终也会超时。


至于服务器端到底发生了什么:由于服务器在自己的超时到期之前不知道连接已死,因此它会认为连接良好,并且通常会处理请求并尝试编写响应。可能会对响应进行一些缓冲,因此尝试写入响应甚至可能看起来对服务器有效。

当服务器尝试向响应写入足够的数据以填充可能的缓冲区时,它将阻塞,然后在发生超时时将引发异常,最终让服务器知道连接超时。

如果服务器没有用其响应填充缓冲区,则在尝试关闭连接时应该发生相同的情况(阻塞,然后异常((但这可能已经发生在应用程序外部的应用服务器容器代码中(。

如果最终尝试在超时发生后编写响应,则应立即收到异常。

因此,服务器上究竟发生了什么很大程度上取决于您自己的代码:

  • 如果仅在执行所有相关操作后写入响应,则将执行这些操作
  • 如果混合使用业务逻辑和编写响应,则某些逻辑可能会执行,也可能不会执行(取决于已写入响应的数据量以及在什么时间写入(,并且没有好方法来估计将会发生什么

无论哪种方式,服务器最终都会知道发生的超时,但我不确定您的应用程序是否总是会获得此信息。

当客户端使用 readTimeout 关闭与 API 的连接时,服务器上会发生什么情况。

与客户端因任何其他原因关闭时发生的情况相同。服务器将继续执行请求,成功写入响应的第一部分,并且在写入其余部分时可能会收到"连接重置"错误,如果有休息,取决于时间和响应时间等。

请求的执行将完成吗

是的。

或者一旦发生超时就会中断

不。

或者执行将完成

是的。

并且响应流被服务器应该发送给用户的响应堵塞

是的,但这最终会导致服务器上的"连接重置"。

相关内容

最新更新