如何优雅地关闭(SIGTERM)Apollo Server 实例?

Fab*_*bis 10 node.js sigterm express apollo

可以使用 终止实际的 HTTP 服务器实例server.close(callback),但我不确定任何挂起的 WebSocket 操作(通过 WebSocket 运行的突变或查询)会发生什么。由于 http.Server 对 WebSocket 操作一无所知,它可能会忽略它们。如何正确确保当收到 SIGTERM 时,服务器停止接受新请求/webSocket 连接,完成挂起的连接然后关闭?

用谷歌找不到任何关于此的信息。

dna*_*ion 1

假设根据提出这个问题的年份,您正在询问 ApolloServer v2。Apollo Server 实例确实提供了根据文档等待所有后台任务运行的stop功能。因此它将等待现有查询完成后再终止服务器。该方法也适用于 v3 。

ApolloServer.stop()是一个异步方法,它告诉 Apollo Server 的所有后台任务完成。它调用并等待所有 serverWillStop插件处理程序 (包括使用情况报告插件的处理程序,它将最终使用情况报告发送到 Apollo Studio)。此方法不带任何参数。

如果您的服务器是联合网关stop还会停止特定于网关的后台活动,例如轮询更新的服务配置。

stop在某些情况下,当进程收到SIGINT或信号时, Apollo Server 会自动调用SIGTERM。有关详细信息,请参阅 stopOnTerminationSignals构造函数选项

如果您正在使用该apollo-server包(它为您处理设置 HTTP 服务器),则此方法首先会停止 HTTP 服务器。具体来说,它:

  • 停止侦听新连接
  • 关闭空闲连接(即当前没有 HTTP 请求的连接)
  • 每当活动连接空闲时关闭它们
  • 等待所有连接关闭

如果任何连接在宽限期(默认为 10 秒)后仍保持活动状态,Apollo Server 将强制关闭这些连接。stopGracePeriodMillis 您可以使用构造函数选项配置此宽限期。

如果您使用中间件包 而不是apollo-server,则应在调用 之前停止 HTTP 服务器ApolloServer.stop()