关闭非常繁忙的生产节点

Shutting down VERY busy production node

提问人:Merc 提问时间:2/28/2017 更新时间:3/4/2017 访问量:150

问:

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

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

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

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

节点 .js

评论

1赞 Merc 2/28/2017
说真的,这是一个编程问题,我已经做了自己的研究,提出了一个解决方案......为什么投反对票?!?
1赞 Merc 2/28/2017
可悲的是,无论谁投了反对票(没有评论)都会埋葬这个问题。好东西。
0赞 Arc 2/28/2017
您可以捕获信号并适当地处理它们(例如)...例如,谷歌。传统上,SIGINT 旨在作为强制终止,SIGTERM 应处理正常关闭。process.on()node graceful shutdown

答:

1赞 Alpha 3/4/2017 #1

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

这是负载平衡器最有用的目的,您可以控制特定服务器获得的流量,如果需要关闭服务器,您可以安全地告诉它不再被使用。由于您直接与服务器一起打开了 websocket,因此这些连接很可能会直接保存到该服务器,并且无法通过负载均衡器进行代理(不确定),但是不创建新连接最终会使这些连接最终消失。

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

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

最后,正如Archimendix所建议的那样,使用来处理平稳终止几乎是跨平台的标准。(这让我想起了许多基于 Java 的服务器,它们需要一些时间才能关闭。根据非终止应用影响的严重性,您可能希望让该过程挂起更长的时间,甚至执行关闭过程,但您应该考虑到这并不总是可行的。process.on()

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

评论

0赞 Merc 4/8/2017
接受这个答案,但我也在这里发布了一个更好的问题:stackoverflow.com/questions/43294764/......我有代码和实用的想法......任何提示都将非常欢迎!