【问题标题】:Dropping a streaming HTTP connection as soon as possible after losing connection断开连接后尽快断开流式 HTTP 连接
【发布时间】: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 是的,这些是要配置的参数。

标签: sockets tcp erlang ip


【解决方案1】:

Isac 的评论为我回答了这个问题 - 在机器级别配置套接字保持活动超时。

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      相关资源
      最近更新 更多