【问题标题】:How to avoid packet loss on server application restart?如何避免服务器应用程序重启时丢包?
【发布时间】:2011-07-20 22:41:47
【问题描述】:

服务器/Web 应用程序的典型情况是应用程序需要关闭并重新启动以实施升级。

有哪些可能/常见的方案(和可用软件)来避免在应用程序消失的短时间内丢失客户端发送到服务器的数据?

一个可行的示例方案是:对于客户端连接到端口 80 的简单 Web 服务器,而不是客户端直接连接到 Web 服务器应用程序,可以在两者之间有一个简单的应用程序侦听端口 80 和无缝地向/从“实际”Web 服务器应用程序(在某个其他端口上)转发/返回数据。当网络服务器需要关闭并重新启动时,中继应用程序可以检测到这一点并缓冲所有传入的数据,直到网络服务器恢复运行。这样,总是有一个应用程序监听端口 80,并且数据永远不会丢失(当然,在缓冲区大小和时间原因内)。这种简单的中间缓冲区接收者不可用的软件是否已经存在?

我最感兴趣的是针对单个应用程序实例的解决方案,而不是有多个实例的解决方案(在这种情况下,可以使用巧妙的滚动更新方案),但为了获得完整的答案集,任何响应会很棒!

【问题讨论】:

  • 那么当托管“中间”应用程序的服务器出现故障时会发生什么?
  • @Michael Kent - 举个例子,服务显然会宕机。但是,具有缓冲功能的中继应用程序将是一心一意的,不需要更新即可将其关闭,或者至少比主应用程序少得多。崩溃是另一回事......我只对已知/计划的更新/维护感兴趣。
  • 然后,您的“中间”应用程序(在目标应用程序关闭时将其输入排队)是一个候选解决方案。不过,您可能想在重新发明轮子之前环顾四周。我相信 RabbitMQ 经常用于此目的,但可能有点矫枉过正。

标签: python linux web-services tcp network-programming


【解决方案1】:

为避免这种情况,请在负载平衡器后面放置多个应用程序服务器。在关闭之前,请确保负载均衡器不会向其发送新客户端。关闭它,流量将转到其他应用程序服务器,当它恢复时,流量将再次开始发送给它。

如果您只有一个应用程序服务器,那么简单地“缓冲”网络流量是一个糟糕的解决方案。当服务器重新启动时,它不再有任何 TCP 状态信息,而且旧的传入连接也无处可去。

【讨论】:

  • TCP 状态丢失时为真,尽管这可以通过向中继进程发出升级即将到来的信号来管理,所以开始缓冲!一旦进程内套接字完成,就可以重新启动。当然,这依赖于“短”连接寿命,否则缓冲区可能会爆炸。如果这失败(达到最大缓冲区或超时),那么您要么在缓冲时拉开裂绳并吃掉停机时间,要么换一种方式刷新缓冲区并中止升级“由于套接字占用,现在无法升级”)。
  • 我忘了补充一点,在我的特定情况下,多个应用程序的事情是不可能的(尽管我的问题是一般性的)。我即将对我假设的缓冲继电器进行原型设计以检查性能,但我宁愿不必重新发明它,因为我敢打赌要变得可靠和快速会很棘手。
  • 与负载平衡解决方案相比,这种“TCP 缓冲”解决方案极其复杂且容易出现故障。我以前从未听说过缓冲解决方案,但是一直在部署数以万计的负载均衡器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2015-08-06
  • 2014-07-03
  • 1970-01-01
  • 2015-05-08
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多