Tomcat 7 servlet需要强制关闭持久的NIO连接

时间:2012-01-20 01:39:00

标签: tomcat connection nio

我有一个Tomcat 7 servlet接受来自远程客户端的连接,并且如果可能的话,保持这些连接打开数小时或数天。所以,我们正在使用NIO连接器。 物理连接上的带宽可能很昂贵,因此流量应保持在绝对最小值,因此我们已经编程了远程客户端以非常罕见的ping来测试连接。

偶尔会告诉servlet连接已关闭,但似乎没有告知远程客户端。客户端在执行ping操作之前不会发现,此时他们可以建立新连接。我们需要减少客户端未连接的时间长度,而不使用更多ping。

一种有效的方法是关闭Tomcat服务器。客户知道他们立即断开连接。显然我们不想关闭Tomcat - 我的观点是必须有某种信号使它跨越正常安静的连接。

如何强制Tomcat发送此信号?请不要回答说我不能,除非你能告诉我为什么,具体细节,部分是因为我无法相信,而且主要是因为我不想相信它。这似乎很奇怪 - 就像不能把电话挂在某人身上一样。

备选问题#1 - servlet可以恢复已被告知已关闭的连接吗?

替代问题#2 - 任何人都可以想到其他可能有帮助的问题吗?

2 个答案:

答案 0 :(得分:0)

有几点想法:

  • 我很惊讶客户不知道连接已被删除。你确定在客户端某处没有吞下异常吗?
  • 通过几天的连接,我将开始研究TCP层上发生的事情。你没有提到任何诊断或信息......
    • 您是否曾尝试确定这些问题客户端/服务器连接是否仍存在基础TCP / IP连接?
    • 客户端和服务器之间的网络有多稳定?
    • 他们潜在行为不端的网络设备,如代理或路由器是否涉及?
  • 我没有看到在长寿命连接的上下文中使用NIO连接器的好处。每秒许多请求?是。但只是为了长期生活的联系?没有。
    • 在过去,我遇到了一个奇怪的问题,即NIO连接器和servlet协议网关(OpenAMF),它使用默认的HTTP连接器神奇地消失了。
    • 测试其他两个连接器(HTTP,本机ARP),对它们进行基准测试。
  • 我还会考虑放弃任何基于TCP的协议(如HTTP),转而使用基于UDP的方法。这样你的连接将是无状态的,并且通过定制调整的有效载荷,数据包非常小。

答案 1 :(得分:0)

我正在回答这个老问题,因为我们已经看到HTTP连接(或任何TCP连接)持续打开数十分钟而且防火墙没有流量的相同问题。如果确实没有防火墙,那么我的答案不适用。

你可以在客户端和服务器上同时使用tcpdump / wireshark来确认这个理论,并且有一些耐心。

如果有防火墙,那么您需要确保“ping”数据包比防火墙的空闲TCP连接超时更频繁地发生,以保持连接活动。在增加防火墙超时之前要三思而后行,防火墙可能无法达到它,正如我将解释的那样。

客户端和服务器之间的防火墙可能正在执行NAT或某些数据包检查。这些功能需要防火墙上的资源,并且防火墙将跟踪的连接数量有限。因此,默认情况下,它会在空闲时间后“静默关闭”这些连接,以节省资源。

我默默地说,因为在客户端或服务器发送流量之前,防火墙不会向任何一方发送任何数据包。此时,防火墙通常会使用RST数据包进行响应。我们使用来自客户端和服务器的tcpdump来跟踪它。它显示防火墙发送此RST数据包就像从连接侧一样。但是另一方的tcpdump确认此数据包未被发送。它必须是防火墙。

增加防火墙上空闲超时的大小可能会导致更多问题,因为防火墙可能无法处理连接数。这可能会导致整个防火墙重置,您可以在防火墙上看到所有tcp套接字。

由于必须使用TCP,因此请避免使用任何需要在防火墙上进行连接跟踪的防火墙功能(NAT,计费,数据包检查)。或者确保您的防火墙具有足够的资源来跟踪所有连接。