代码之家  ›  专栏  ›  技术社区  ›  stilllife

当chrome保持套接字空闲时,节点api正常关闭,服务器关闭

  •  1
  • stilllife  · 技术社区  · 7 年前

    脚本 :nodejs rest api使用 http.createServer()

    目标 :当 SIGNINT comes(在我的例子中是从pm2 reload)优雅地关闭服务器,然后关闭db连接,然后和平地退出。

    代码 :

    // index.js
    
    server.keepAliveTimeout = 10
    
    process.on('SIGINT', () => {
        server.close(err => {
            // close the DB
            ...
            process.exit(0)
        })
    })
    
    // the code related to any API response
    const headers = {
       ...
       'Connection': 'close'
    }
    response.writeHead(statusCode, headers)
    return response.end(JSON.stringify(data))
    

    问题 : server.close 回拨永远不会触发。pm2进程在(在我的情况下)20秒后到达超时,因此关机不再正常。

    调查原因 :如果没有打开浏览器连接(例如,如果没有人调用api),或者api调用是使用firefox进行的,则回调会很好地触发。换成铬,我可以看到 chrome://net-internals/#sockets 启动请求后1个空闲传输套接字池。在这种情况下 close 回调不启动。一旦清除chrome中的空闲套接字,回调就会正常启动。注意,在chrome的匿名模式下,套接字不会保持空闲状态,而是正确关闭,因此会触发回调。

    问题 :

    • 这是chrome的缺陷还是正常行为?
    • 头球不应该 Connection: close 还有短的 keepAliveTimeout 足以通知任何客户端他们不应该让任何套接字保持打开这么长时间吗?
    • 这是处理客户的正确方法 服务器关闭 完成?
    • 我要循环通过所有创建的套接字并手动关闭它们吗?
    0 回复  |  直到 7 年前
    推荐文章