# 服务节点优雅关闭方案 ## 1. 核心目标 实现服务节点的优雅关闭,确保在停止服务时不丢失任何正在处理的用户请求,同时不影响整个集群的可用性。 ## 2. 实现方案说明 该方案通过结合 **Nginx 反向代理**、**Gunicorn 服务器**、**Uvicorn 服务器** 和 **FastAPI** 协作来实现目标。 ![graceful_shutdown](images/graceful_shutdown.png) ## 3. 组件介绍 ### 1. Nginx:流量入口与负载均衡器 - **功能**: - 作为反向代理,接收所有外部客户端请求并按负载均衡策略分发到上游(Upstream)的 Gunicorn 工作节点。 - 通过健康检查机制主动监控后端节点的健康状态。 - 通过配置管理,能够瞬时地将问题节点从服务池中摘除,实现流量切换。 ### 2. Gunicorn:WSGI HTTP 服务器(进程管理器) - **功能**: - 作为主进程(Master Process),负责管理多个 Uvicorn 工作子进程(Worker Process)。 - 接收外部信号(如 `SIGTERM`),并协调所有子进程的优雅关闭流程。 - 守护工作进程,在进程异常退出时自动重启,保证服务健壮性。 ### 3. Uvicorn:ASGI 服务器(工作进程) - **功能**: - 作为 Gunicorn 管理的 Worker,实际负责处理 HTTP 请求。 - 运行 FastAPI 应用实例,处理具体的业务逻辑。 - 实现 ASGI 协议,支持异步请求处理,高性能。 --- ## 优势 1. **Nginx**: - 能够快速隔离故障节点,保证整体服务的可用性。 - 通过 `nginx -s reload` 可不停机更新配置,对用户无感知。 2. **Gunicorn**(相比于 Uvicorn 原生的多 Worker): - **成熟的进程管理**:内置了完善的进程生成、回收、管理逻辑,无需自己实现。 - **进程守护能力**:Gunicorn Master 会在 Worker 异常退出后自动 fork 新 Worker,而 Uvicorn `--workers` 模式下任何进程崩溃都不会被重新拉起,需要外部守护进程。 - **配置丰富**:提供大量参数用于调整超时、Worker 数量、重启策略等。 3. **Uvicorn**: - 基于 uvloop 和 httptools,速度极快。 - 原生支持优雅关闭:在收到关闭信号后,会停止接受新连接,并等待现有请求处理完成后再退出。 --- ## 优雅关闭流程 当需要下线某个特定节点时,步骤如下: 1. **Nginx 监控节点状态是否健康**: - 通过向节点定时发送 health 请求,监控节点的健康状态。 2. **从负载均衡中摘除**: - 修改 Nginx 配置,将该节点标记为 `down` 状态,并重载 Nginx 配置。 - 此后,所有新请求将不再被发送到目标节点。 3. **Gunicorn 服务器**: - 监控停止信号,收到停止信号(如 `SIGTERM` 信号)时,会把此信号向所有的 Uvicorn 子进程发送。 4. **发送停止信号**: - 向目标节点的 Uvicorn 进程发送 `SIGTERM` 信号,触发 Uvicorn 的优雅关闭流程。 5. **等待请求处理**: - 等待一段稍长于 `timeout_graceful_shutdown` 的时间后强制终止服务,让该节点有充足的时间完成所有已接收请求的处理。 6. **关闭完成**: - 此时,该节点已经处理完所有存量请求并安全退出。