【发布时间】: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