【问题标题】:Shutting down VERY busy production node关闭非常繁忙的生产节点
【发布时间】:2017-07-19 01:18:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 说真的,这是一个编程问题,我已经完成了自己的研究,提出了一个解决方案....为什么不赞成?!?
  • 可悲的是,无论谁投反对票(没有评论)都会埋葬这个问题。不错。
  • 您可以捕获信号并适当地处理它们(例如使用process.on())...例如谷歌node graceful shutdown。按照惯例,SIGINT 旨在作为强制终止,SIGTERM 应处理正常关闭。

标签: node.js


【解决方案1】:

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

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

或者,考虑一个穷人版本的负载平衡器,并在此服务器上设置一个代理,该代理会影响其他服务器。如果您的所有状态都通过一个通用数据库持久化,则不会中断任何操作,并且您可以给事件循环足够的时间(无论是什么时间)来完成。

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

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

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

【讨论】:

猜你喜欢
  • 2022-08-19
  • 2020-01-12
  • 2012-01-22
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多