因此,我们想要实现的是维持从移动设备到我们的 Erlang HTTP 服务器的大量并发连接。当然,移动设备的连接可能会出现相当间歇性的情况,因此我们希望尽快删除死连接,以避免产生开销。
现在,我不确定我们应该在什么级别检测死连接。 TCP 有保活数据包,需要 ACK。因此,理想情况下,我们每 15 秒发送一个保活数据包,如果我们在接下来的 15 秒内没有收到 ACK,那么我们就会断开连接。然而,我不知道这在 Erlang 中是否可能。另外,我认为某些 NAT、Wi-Fi 路由器和移动网络可能会在一定时间内确认保持事件,如果我错了,请纠正我。是这样吗?如果是这样,是否有任何 TCP 级别的替代方法来执行“心跳”?
我们还尝试了应用程序级心跳 - 沿 HTTP 流发送\n。然而,即使设置了所有适用的 Erlang 选项(包括 send_timeout),在某些情况下(例如,移动设备距离 Wi-Fi 路由器太远),我们在大约 5 分钟内不会收到任何错误。
我们如何才能最好地实现流式 HTTP 连接,使服务器在失去联系后尽快断开连接?任何帮助将不胜感激!
最佳答案
您可以为 HTTP 连接添加特定的看门狗。看门狗将具有可配置的超时,该超时将在连接上的每次操作(读或写)后重置。如果在指定的超时时间内没有对套接字进行任何操作 - 连接将关闭。
这种方法将消除过时连接的问题(连接完全健康但没有任何 I/O 事件)。如果客户端超出覆盖范围,连接将仅持续指定的超时时间。使用看门狗方法时也不需要保持事件机制。
唯一的缺点是服务器不会立即检测到断开的连接,而是等待连接看门狗中指定的超时。
关于sockets - 失去连接后尽快断开流式 HTTP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418643/