【问题标题】:restart node.js forever process if response time too big如果响应时间过长,则永远重启 node.js
【发布时间】:2014-05-18 00:50:05
【问题描述】:

我得到了用于管理 node.js 站点的永久脚本。

有时node.js 站点挂起,响应时间超过 30 秒。事实上网站已经关闭。然后快速治愈它正在重新启动forever

$ forever restart 3

其中3forever list 中的脚本编号。

可以自动生成吗? forever 中是否有选项可以在响应时间超过 2 秒时重新启动?

或者也许我必须运行外部脚本来检查响应时间并下降以重新启动挂起forever 脚本。

或者也许我需要在我的node.js 站点中编写这个逻辑?

【问题讨论】:

    标签: node.js forever


    【解决方案1】:

    如果大部分回复的时间超过 x 秒,我假设您想重新启动服务器。有许多工具可以帮助您根据运行状况重新启动实例。蒙尼特就是其中之一。在this 指南中,如果 10 秒内没有回复,则监控重启实例。

    如果您想在一个请求的任何请求花费的时间过长的情况下终止实例,那么您记下您接受请求的时间,并记下请求离开的时间。如果时间太长,抛出一个你知道不会被捕获的异常,服务器会自行重启。如果您使用 express,请在开发模式下检查其 logger 的代码,因为它会跟踪响应时间。

    【讨论】:

      【解决方案2】:

      除了leorex solution,我之前有类似这样的东西可以发送 500 超时请求:

      var writeHead = res.writeHead;
      var timeout = setTimeout(function () {
          res.statusCode = 500;
          res.end('Response timed out');
          // To avoid errors being thrown for writes after this, they should be ignored.
          res.writeHead = res.write = res.end = function () {};
      }, 40000);
      res.writeHead = function () {
          // This was called in time.
          clearTimeout(timeout);
          writeHead.apply(this, arguments);
      };
      

      可以使用addTimeout模块去掉超时清除部分。

      实施后,您可以随心所欲地处理,您只需致电process.exit(1);,这样永远将立即取代您。

      你可以让它更聪明。同样在我的应用程序中,如果发生未捕获的错误,我会向主管进程发出信号,以便它启动另一个工作进程并正常关闭(关闭 http 服务器并等待所有待处理的请求完成)。您可以在您的应用程序中执行相同的操作,但请确保所有内容都有超时回调作为故障转移/备份计划。

      【讨论】:

      • 在 res.writeHead 之前放一个无限循环;请求永远不会超时。所以这不会阻止节点挂断
      • 是的,它本身还不够好。我建议这样做,并使用 Monit 来监控它,就像 leorex 在他的 answer 中建议的那样
      • 我看了一下Monit,看起来不错,但不再更新了?对于超时,github.com/expressjs/timeout 不是更好的选择吗?假设使用 Express
      • 顺便说一句,您启动另一个进程并在出现错误时优雅地关闭当前进程的方法很有趣。你有任何代码示例说明你是如何实现的吗?
      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2016-10-24
      • 2016-07-20
      • 2018-11-19
      相关资源
      最近更新 更多