closures非常繁忙的生产节点

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

我想这是一个解决scheme:

  • 我发送一个自定义的UNIX信号到进程(例如SIGUSR2?);
  • 当server.js获取信号时:
    • 它停止听80端口
    • 它等待事件循环干涸
    • 如果在10秒钟之后仍然挂起,则强制closures。这意味着在每次重新启动时,服务器将最多停下10秒。

这是现实世界中的人们做的吗? 任何疑难杂症? 如何检查事件循环是否为空?

我希望这解决您的问题,但至less希望有所帮助(这是太长的评论)。

这是负载平衡器最有用的目的,您可以控制特定服务器启动的stream量,如果您需要closures服务器,则可以通过安全来判断是否不再使用该服务器。 由于你的websockets直接与服务器打开,很可能这些连接将直接持久保存到那个服务器,并且不能通过负载平衡器(不知道这个)进行代理,但是不会创build新的连接最终会使这些连接最终死亡。

或者,考虑穷人的负载平衡器版本,并在此服务器上设置一个代理,将其他服务器。 如果你所有的状态都是通过一个公共的数据库持久化的,那么不会有任何操作中断,而且你可以给事件循环提供足够的时间(不pipe是什么)。

至于服务器的使用情况,如果你现在还没有办法告诉事件循环是怎么回事,那么你在服务器上的任何应用程序日志都可能帮助你确定你的应用程序在做什么,你在一个特定的时刻closures它是多么的安全。 (同样的,在这之前你可以减less使用的越多越好。)

最后,正如Archimendix所build议的那样,使用process.on()处理正常终止几乎是跨平台的标准。 (使我记得许多基于Java的服务器需要一些时间来closures。)根据非终止应用程序的影响的严重程度,您可能希望让该过程挂起一段时间,甚至执行closures程序,但你应该认为这并不总是可能的。

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