2012-02-23 104 views
2

所以我们试图实现的是保持从移动设备到我们的Erlang HTTP服务器的大量并发连接。移动设备当然可能有非常间歇性的连接,所以我们希望尽快放弃无用的连接,以避免它们的开销。丢失连接后尽快丢弃流HTTP连接

现在,我不确定应该在什么级别检测死连接。 TCP有keepalive数据包,它需要一个ACK。所以理想情况下,我们会在15秒内发送一个Keepalive数据包,如果我们在接下来的15秒内没有收到ACK,那么我们会断开连接。但是,我不知道这在Erlang中甚至是可能的。另外,我认为有些NAT,Wi-Fi路由器和移动网络可能会在一段时间内确认Keepalive,如果我错了,请纠正我的错误。是这样的,如果是的话,是否有任何TCP级别的替代方式来做'心跳'?

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

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

+0

若不是HTTP我只是建议发送来自客户端的东西。您是使用现成的HTTP服务器还是编写自定义的服务器? – 2012-02-23 18:28:59

+0

你不能在机器级配置套接字保持活动超时吗? – Isac 2012-02-23 18:47:45

+0

@asaddude我们编写了自己的HTTP服务器。如果可能的话,我们希望坚持使用HTTP,并且在请求之后不做任何双向的东西。 – Max 2012-02-23 19:26:25

回答

2

您可以为HTTP连接添加特定的看门狗。看门狗将具有可配置的超时时间,在连接的每个操作(读取或写入)之后都会被重置。如果在指定的超时时间内没有对套接字进行操作 - 连接关闭。

该方法将消除过时连接(连接完美健康但没有任何I/O活动)的问题。如果客户端不在覆盖范围内 - 连接将只持续到指定的超时。使用看门狗方法时也不需要保持活动机制。

唯一的缺点是服务器不会立即检测到连接断开,而是会等待连接看门狗中指定的超时。