关闭非常繁忙的生产节点

时间:2017-02-28 07:19:31

标签: node.js

我在生产服务器上有一个非常非常繁忙的节点应用程序。该应用程序处理实时聊天(使用websockets)以及电子商务付款。虽然所有是绝对设置的,但是当服务器关闭时,客户端将重新连接其套接字等,我仍然有一个问题:每当服务器停止时,使用SIGINT,事件循环都会被切断。这意味着任何挂起的DB写入(可能用于金融交易)都会被丢弃。有两个特别关键的时刻(当信用卡商家给出OK时,但之前我们在数据库上写下记录)并且目前我们在非高峰时间将其关闭以防止任何可能的问题。但这很糟糕。

我认为这是一个解决方案:

  • 我向流程发送自定义UNIX信号(例如SIGUSR2?);
  • 当server.js收到信号时:
    • 停止收听端口80
    • 等待事件循环干涸
    • 如果在10秒后它仍然悬挂,它会强制关闭 这意味着每次重启时服务器将最多停机10秒钟。

这是现实世界中的人们做的吗?有问题吗?如何检查事件循环是否为空?

1 个答案:

答案 0 :(得分:1)

我希望这能解决你的问题,但至少希望有所帮助(而且评论的时间太长了。)

这是负载均衡器最有用的目的,您可以控制特定服务器达到的流量,如果您需要关闭服务器,您可以告诉安全性它没有被使用了。由于您可以直接使用服务器打开websockets,因此很可能这些连接将直接保存到该服务器,并且无法通过负载均衡器进行代理(不确定),但是不创建新连接最终会使这些连接成为可能。最终死了。

或者,考虑一个穷人的负载均衡器版本,并在此服务器上设置代理服务器上的代理服务器。如果你的所有状态都是通过一个公共数据库保存的,那么任何操作都不会中断,你可以给它足够的时间(无论是什么),以便完成事件循环。

至于服务器的使用情况,如果您目前没有办法告诉事件循环发生了什么,那么您在服务器中拥有的任何应用程序日志都可能有助于确定您的应用程序正在做什么,以及只有良好的判断力才会告诉你在特定时刻关闭它是多么安全。 (同样,在此之前你可以减少使用它的次数越多越好。)

最后,正如Archimendix建议的那样,使用process.on()处理优雅终止几乎是跨平台的标准。 (让我记得很多基于Java的服务器需要一些时间才能关闭。)根据非终止应用程序效果的严重程度,您可能希望让进程挂起一段时间甚至执行关闭程序,但你应该考虑到这并不总是可行的。

最后,尽量避免依赖任何特定服务器。受控制的关闭很容易处理,但是中断和硬件故障不会给您带来等待事件循环的好处。