【问题标题】:AWS ELB servlet client disconnection detectionAWS ELB servlet 客户端断开连接检测
【发布时间】:2016-02-23 17:34:22
【问题描述】:

免责声明:有很多关于类似主题的信息。在我们的例子中,它在没有 AWS ELB(弹性负载均衡器)的情况下按预期工作,即当客户端下降时,ServletOutputStream.flush() 抛出 IOException。

设置:我们有一个在 ELB (HTTPS:443 -> HTTP:8080) 后面运行 Tomcat 7 (Java 1.7) 的实例。 servlet 通过 HTTP 长寿命连接将数据流式传输到客户端。

问题:当客户端断开连接时,服务器保持流数据,即 ServletOutputStream.flush() 或 .write() 不会抛出 IOException。 ELB 类型的“缓冲”连接(我们可以通过 IpTraf 监视器看到它),因此从 Tomcat 端看,它显示为客户端仍然存在。如果没有 ELB,IOException 会正确抛出,因此 servlet 可以停止流式传输。我们禁用了连接耗尽并将连接超时减少到 1 秒,我们还将 Tomcat 的 HTTP 连接器(包括 KeepAlive)上的所有超时减少到只有几秒钟。没有任何帮助。

问题:我们可以对 ELB 配置/Tomcat/Java 端做些什么来允许在此设置中进行断开连接检测?

【问题讨论】:

  • 在 TCP 模式下运行 ELB 有什么不同吗?
  • @Michael:是的,这个配置有点不同 SSL:443 -> TCP:8080(这对我们的应用程序没有好处,因为它不支持会话粘性)。根据 IpTraf 监视器,从 ELB 到实例的 TCP 连接已关闭,但从实例到 ELB 的 TCP 连接保持打开并流式传输数据。

标签: java tomcat servlets amazon-web-services


【解决方案1】:

我们遇到了同样的问题(但在带有 IIS 的 .NET 中)。 我们似乎通过从经典 ELB 切换到应用程序 ELB 解决了这个问题。现在写入已关闭连接的输出流会出现异常,但首先(在经典 ELB 上)它没有。

希望对遇到同样问题的人有所帮助

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2011-07-08
    • 2014-04-14
    • 2020-01-15
    • 1970-01-01
    • 2012-05-17
    • 2021-02-21
    相关资源
    最近更新 更多