2016-07-04 36 views
1

我的nodejs应用程序需要一段时间才能接受请求(资源被编译等)。如何从pm2下的群集进程延迟“在线”事件?

当我在pm2集群模式下运行它并触发重新加载时,pm2开始逐个重新加载实例 - 但它不会等到应用程序实际上能够接受请求并继续重新启动其他实例 - 哪些导致所有情况下都会停滞一段时间。

翻看pm2源代码,似乎它等待工作进程发出“在线”事件,并且该事件发生得太快。

有没有办法延迟这个在线事件来实现正常的重新加载?

这里的测试用例:

var http = require("http"); 

setTimeout(() => { 
    var server = http.createServer((req, res) => { 
    res.statusCode = 200; 
    res.setHeader("Content-Type", "text/plain"); 
    res.end("hello\n"); 
    }); 

    server.listen(7000, "127.0.0.1",() => { 
    console.log("server ready"); 
    }); 
}, 10000); 

开始pm2 start app -i 2,然后尝试用pm2 reload app重装。 在我的机器,有大约4秒窗口时,应用程序不响应请求都:

curl: (7) Failed to connect to localhost port 7000: Connection refused 

(你可以方便地监控,如果应用程序是watch curl -sS localhost:7000在线)

回答

1

增加GRACEFUL_LISTEN_TIMEOUT值修复该问题 - 默认情况下,它被设置为3秒,这意味着pm2放弃太快并继续下一个实例。

你可以改变这样的价值:

PM2_GRACEFUL_LISTEN_TIMEOUT=15000 pm2 update