Node.js 使用keepalives高效关闭HTTP?
当所有连接关闭时,此Node.js服务器将在Ctrl+C上完全关闭Node.js 使用keepalives高效关闭HTTP?,node.js,http,Node.js,Http,当所有连接关闭时,此Node.js服务器将在Ctrl+C上完全关闭 var http = require('http'); var app = http.createServer(function (req, res) { res.end('Hello'); }); process.on('SIGINT', function() { console.log('Closing...'); app.close(function () { console.log('Closed.
var http = require('http');
var app = http.createServer(function (req, res) {
res.end('Hello');
});
process.on('SIGINT', function() {
console.log('Closing...');
app.close(function () {
console.log('Closed.');
process.exit();
});
});
app.listen(3000);
问题是它包含了keepalive连接。如果你在Chrome中打开该应用的一个标签,然后尝试按Ctrl+C组合键,当Chrome最终释放连接时,它不会关闭大约2分钟
是否有一种干净的方法可以检测何时不再有HTTP请求,即使某些连接仍处于打开状态?您可以使用响应时的finish事件对某些请求进行跟踪:
var reqCount = 0;
var app = http.createServer(function (req, res) {
reqCount++;
res.on('finish', function() { reqCount--; });
res.end('Hello');
});
允许您在关闭服务器时检查reqCount是否为零
但是,正确的做法可能是不关心旧服务器,而只是启动一个新服务器。通常,重新启动是为了获得新代码,因此您可以启动一个新流程,而无需等待旧流程结束,也可以选择使用child_process模块让顶级脚本管理整个流程。或者甚至使用集群模块,允许您在关闭旧进程之前启动新进程,因为集群管理其子实例之间的流量平衡
到目前为止,我还没有真正测试过的一件事是,一旦server.close返回,是否可以保证安全地启动新服务器。否则,新服务器可能无法绑定。文档中有一个关于如何处理此类EADDRINUSE错误的示例。您可以通过响应时的finish事件来破解一些请求跟踪:
var reqCount = 0;
var app = http.createServer(function (req, res) {
reqCount++;
res.on('finish', function() { reqCount--; });
res.end('Hello');
});
允许您在关闭服务器时检查reqCount是否为零
但是,正确的做法可能是不关心旧服务器,而只是启动一个新服务器。通常,重新启动是为了获得新代码,因此您可以启动一个新流程,而无需等待旧流程结束,也可以选择使用child_process模块让顶级脚本管理整个流程。或者甚至使用集群模块,允许您在关闭旧进程之前启动新进程,因为集群管理其子实例之间的流量平衡
到目前为止,我还没有真正测试过的一件事是,一旦server.close返回,是否可以保证安全地启动新服务器。否则,新服务器可能无法绑定。文档中有一个关于如何处理此类EADDRINUSE错误的示例。默认情况下没有套接字超时,这意味着连接将永远打开,直到客户端关闭为止。如果要设置超时,请使用此函数: 如果您试图关闭服务器,您根本无法关闭,因为存在活动连接,因此如果您尝试正常关闭,关闭功能将挂起。唯一的方法是设置一个超时,并在超时时终止应用程序
如果你有worker,那么就没有用process.exit杀死应用程序那么简单了,所以我制作了一个模块,它可以完全按照你的要求执行:。默认情况下没有套接字超时,这意味着连接将永远打开,直到客户端关闭它们。如果要设置超时,请使用此函数: 如果您试图关闭服务器,您根本无法关闭,因为存在活动连接,因此如果您尝试正常关闭,关闭功能将挂起。唯一的方法是设置一个超时,并在超时时终止应用程序
如果你有工作人员,那就没有用process.exit杀死应用程序那么简单了,所以我制作了一个模块,它可以完全满足你的要求:。你能关闭监听套接字,然后立即启动一个新服务器吗?如果我在同一个过程中启动一个新服务器,是的,它可以开始侦听并在那里接受新的连接。我希望在开始一个新的过程之前能够真正地等待过程停止,但也许这就是我坚持旧的方式。如果没有其他东西,它在开发过程中是有用的。是的,让它去吧或者可以将keepalive超时时间降低5秒。无论如何,这是一种常见的策略,至少对apache来说是这样。Node显然不同,但它不一定疯狂。另外,只要这个进程关闭了套接字,您就应该能够启动一个新进程并绑定它。您可以关闭侦听套接字,然后立即启动一个新服务器吗?如果我在同一个过程中启动一个新服务器,是的,它可以开始侦听并在那里接受新的连接。我希望在开始一个新的过程之前能够真正地等待过程停止,但也许这就是我坚持旧的方式。如果没有其他东西,它在开发过程中是有用的。是的,让它去吧或者可以将keepalive超时时间降低5秒。无论如何,这是一种常见的策略,至少对apache来说是这样。Node显然不同,但它不一定疯狂。此外,只要这个进程关闭了套接字,您就应该能够启动一个新进程并绑定它。一般来说,如果一个连接的操作失败,您是对的
嗯,那么它是开放的,你要么要暂停,要么就无限期地等待。但特别是HTTP,如果连接不再为任何进一步的HTTP请求提供服务,那么它就不再是“活动的”,并且可以在此基础上关闭。我定义了一个小型的请求计数模块,它公开了一个Express中间件,这正是我的工作。然而,我认为你的答案是正确的,因为我喜欢优雅的外表,我可能会开始使用它,特别是当我开始使用童工的时候。你是对的,一般来说,如果一个连接是开放的,那么它是开放的,你要么必须超时,要么无限期地等待。但特别是HTTP,如果连接不再为任何进一步的HTTP请求提供服务,那么它就不再是“活动的”,并且可以在此基础上关闭。我定义了一个小型的请求计数模块,它公开了一个Express中间件,这正是我的工作。然而,将您的答案标记为正确,因为我喜欢grace的外观,我很可能会开始使用它,特别是当我开始使用child workers.Oops时。您仍然有一个观点-如果您有任何其他东西,例如挂起的计时器回调,那么除了HTTP服务器之外,您还需要关闭所有这些。否则进程将不会自然退出.Oops,。您仍然有一个要点-如果您有任何其他东西,例如挂起的计时器回调,那么除了HTTP服务器之外,您还需要关闭所有这些。否则这个过程就不会自然退出。