Go 服务优雅关闭
Go 服务优雅关闭关注的是在收到停止信号后,如何停止接收新请求、等待在途任务结束并释放资源,而不是直接粗暴退出进程。
#type / concept
#status / growing
#tech / dev / backend
#resource / go
[!info] related notes
- 所属 MOC: Go 服务工程化 MOC
- 前置概念: Go context, Go net/http
- 并列概念: Go worker pool
Go 服务优雅关闭
一句话定义
Go 服务优雅关闭指的是:在进程收到退出信号时,不是立刻硬停,而是有序地停止接收新任务、让在途任务收尾并释放关键资源。
核心机制 / 工作原理
优雅关闭通常要同时处理几件事:
- 接收停止信号
- 广播取消
- 停止新请求进入
- 等待正在执行的任务完成或超时退出
- 关闭数据库连接、消息消费者等外部资源
这也是 context、HTTP server shutdown 和 goroutine 生命周期管理常常一起出现的原因。
最小例子 / 最小场景
一个 HTTP 服务在容器或进程管理器要求退出时,应该先拒绝新连接,再给已有请求一个收尾窗口,而不是让一半请求直接中断。
为什么这部分重要
只要 Go 被用于服务端,这个主题几乎一定会遇到。没有优雅关闭,服务升级、重启和故障恢复都更容易丢请求、破坏任务一致性或留下脏状态。
边界与易混淆点
- 优雅关闭不等于无限等待
- 能收到信号只是开始,真正难点在任务边界和资源释放顺序
- worker、pipeline、HTTP 请求和后台任务,通常需要统一退出策略