【问题标题】:Dead sessions in apache minaapache mina 中的死会话
【发布时间】:2011-09-22 06:24:03
【问题描述】:

我们有一个基于 apache mina 的 GPRS 网关(服务器)。有时,通常当连接从客户端被残酷地终止时,即电源线被拔掉或任何其他异常关闭或网络问题,它不会在服务器端被移除或关闭。它保持在那里,处于空闲状态,因为我不知道多久(可能永远)。 有时我们在关闭服务器时遇到问题,MINA 花费了太多时间,有时我们最终不得不杀死它。我们怀疑这个问题与死连接问题有关。
实际上,这种死连接是有道理的。由于连接被粗暴地关闭并且 mina 没有办法检查它(这就是 tcp session 的工作方式)。 作为一种解决方法,我们设计了一个解决方案,如果会话保持空闲(读取和写入)30 分钟(或任何可配置的时间),我们将关闭会话。我们不喜欢这有两个原因:
1- 看起来不太好。
2- 另外,我们有一条规则,即客户端与服务器建立持久连接。因此,设置“空闲超时”有点困难,因为我们不能关闭任何已空闲 x 分钟/小时的会话,因为它可以是有效的连接。

那么,有没有更好、更安全(在我们的例子中)的方法来检测和清除 MINA 中的这些死连接?

【问题讨论】:

    标签: java network-programming apache-mina


    【解决方案1】:

    在这两种情况下,长时间不活动的连接和丢失的连接 - 在通道中没有活动应该导致在OSI model 的每一层中配置的时间之后超时。 例如。您的防火墙/路由器/服务器可能会在 10 分钟内超时非活动连接条目,那么您的应用程序层连接也应该在 10 分钟后执行此操作 - 等待更多是没有意义的。

    为了防止静默连接超时,应引入保持活动协议。 它可能是 ping(不完全是 ICMP)或其他形式的周期性无操作通信。 当对等体处于活动状态时,它应该响应并因此刷新所有网络层上的超时倒计时。在由于超时或层信号中断连接导致尝试失败后,您可以假设您的应用层连接也中断。

    【讨论】:

    • 感谢您提供有用的见解。我正在寻找的是一种很好的内置方式来使用我正在使用的框架(Apache Mina)来处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多