因此,我们要实现的目标是维护从移动设备到我们的Erlang HTTP服务器的大量并发连接。当然,移动设备可以具有相当断断续续的连接,因此我们希望尽快删除死掉的连接,以避免它们的开销。

现在,我不确定应该在什么级别上检测到死连接。 TCP具有保持 Activity 的数据包,需要ACK。因此,理想情况下,我们每15秒发送一次Keepalive数据包,如果在接下来的15秒内没有收到ACK,则我们将丢弃连接。但是,我不知道在Erlang中这是否可行。另外,我认为某些NAT,Wi-Fi路由器和移动网络有可能在一定时间内确认保持 Activity ,如果我错了,请纠正我。是这种情况,如果是的话,是否有任何TCP级别的替代方法来执行“心跳”?

我们还尝试了应用程序级心跳-在HTTP流中发送\n。但是,即使设置了所有适用的Erlang选项(包括send_timeout),在某些情况下(例如,移动设备离其Wi-Fi路由器距离太远),在大约5分钟内我们都不会收到任何错误。

我们如何最好地实现流式HTTP连接,使服务器在失去联系后将尽快断开连接?任何帮助将不胜感激!

最佳答案

您可以为HTTP连接添加特定的看门狗。看门狗将具有可配置的超时,该超时将在每次连接操作(读取或写入)后重置。并且如果在指定的超时时间内套接字上没有任何操作-连接将关闭。

这种方法将消除过时的连接问题(连接完全正常,但没有任何I/O Activity )。如果客户端不在覆盖范围内-连接将仅持续到指定的超时时间。当使用看门狗方法时,也不需要保持 Activity 机制。

唯一的缺点是服务器不会立即检测到断开的连接,而是将等待连接监视程序中指定的超时。

关于sockets - 失去连接后尽快删除流式HTTP连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9418643/

10-17 01:25