【发布时间】:2012-03-14 04:31:27
【问题描述】:
因此,我们试图实现的是维护从移动设备到我们的 Erlang HTTP 服务器的大量并发连接。当然,移动设备的连接可能会很断断续续,因此我们希望尽快丢弃死连接以避免它们的开销。
现在,我不确定我们应该在什么级别检测死连接。 TCP有keepalive数据包,需要一个ACK。所以理想情况下,我们会每 15 秒发送一个 keepalive 数据包,如果我们在接下来的 15 秒内没有收到 ACK,那么我们将断开连接。但是,我不知道这在 Erlang 中是否可行。此外,我认为某些 NAT、wi-fi 路由器和移动网络可能会在一定时间内对 keepalives 进行 ACK,如果我错了,请纠正我。是这样吗,如果是这样,是否有任何 TCP 级别的替代方式来执行“心跳”?
我们还尝试了应用程序级心跳 - 沿 HTTP 流发送 \n。但是,即使设置了所有适用的 Erlang 选项(包括 send_timeout),在某些情况下(例如移动设备离其 wi-fi 路由器太远),我们在大约 5 分钟内都不会收到任何错误。
我们怎样才能最好地实现一个流式 HTTP 连接,服务器会在失去联系后尽快断开?任何帮助将不胜感激!
【问题讨论】:
-
如果不是 HTTP,我会简单地建议从客户端发送一些东西。您是使用现成的 HTTP 服务器还是编写自定义服务器?
-
不能在机器级别配置socket keep alive timeout吗?
-
@asaddude 我们已经编写了自己的 HTTP 服务器。如果可能的话,我们希望坚持使用 HTTP,并且在请求之后不做任何双向操作。
-
@Isac 这是本页所指的内容吗? tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
-
@Alec 是的,这些是要配置的参数。