因此,我们要努力实现的是维护从移动设备到Erlang HTTP服务器的大量并发连接。移动设备当然可能有非常间歇性的连接,因此我们希望尽快丢弃死连接以避免其开销。
现在,我不确定我们应该在什么级别检测死连接。 TCP具有keepalive数据包,需要ACK。所以理想情况下我们会在15秒内发送一个keepalive数据包,如果我们在接下来的15秒内没有收到ACK,那么我们就会丢弃连接。但是,我不知道这在Erlang中是否可行。此外,我认为有些NAT,wi-fi路由器和移动网络可能会在一段时间内确认Keepalive,如果我错了,请纠正我。是这种情况,如果有的话,是否有任何TCP级替代方式来做'心跳'?
我们还尝试了应用程序级心跳 - 在HTTP流中发送\ n。但是,即使设置了所有适用的Erlang选项,包括send_timeout,在某些情况下,我们也不会在大约5分钟内收到任何错误,例如移动设备偏离其Wi-Fi路由器太远。
我们如何才能最好地实现流量HTTP连接,服务器在失去联系后会尽快丢弃?任何帮助都会非常感激!
答案 0 :(得分:2)
您可以为HTTP连接添加特定的监视程序。看门狗将具有可配置的超时,该超时将在连接上的每次操作(读取或写入)后重置。如果在指定的超时内没有套接字上的操作 - 连接已关闭。
这种方法将消除陈旧连接的问题(连接完全健康但没有任何I / O活动)。如果客户端超出覆盖范围 - 连接将仅持续到指定的超时。使用看门狗方法时也不需要保持活动机制。
唯一的缺点是服务器不会立即检测到断开的连接,而是等待连接监视程序中指定的超时。
答案 1 :(得分:0)
Isac的评论为我解答了 - 配置套接字在机器级保持活动超时。
请参阅http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html