gpt4 book ai didi

node.js - 关闭非常繁忙的生产 Node

转载 作者:搜寻专家 更新时间:2023-10-31 22:51:42 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

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

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

关于node.js - 关闭非常繁忙的生产 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com