What · 是什么
快速启动与优雅终止,最大化鲁棒性
十二要素应用的进程是可处置(disposable)的:可随时启动或停止,这促成快速弹性扩展、代码/config 变更的快速部署以及生产 deploy 的健壮性。
进程应尽量最小化启动时间:理想情况下从启动命令执行到进程就绪接收请求或任务只需几秒,这使弹性扩展与频繁部署成为可能。
短启动时间为 release 过程与扩容提供更多敏捷性,也因进程管理器更易把进程搬到新物理机而增强健壮性。
进程收到进程管理器发出的 SIGTERM 信号时优雅关闭,完成善后工作再退出,是生产环境健壮性的重要保障之一。
web 进程的优雅关闭:停止监听服务端口(拒绝新请求)、允许当前请求完成、然后退出,任务与请求因此能在任何进程变更下安全完成。
该模型隐含 HTTP 请求应短(不超过几秒);长轮询场景下客户端应在连接丢失时无缝尝试重连,崩溃或重启的影响被控制在最小范围。
worker 进程的优雅关闭:把当前任务归还工作队列,如 RabbitMQ 上发送 NACK,Beanstalkd 上 worker 断连时任务自动归队。
锁型系统如 Delayed Job 需确保释放任务记录上的锁,否则任务被永久卡住,让进程迁移与故障恢复都快速而安全。
该模型隐含所有任务可重入(reentrant),通常经把结果包进事务或使操作幂等实现,从机制上保证不丢任务、不重任务。
进程还应健壮应对突然死亡(底层硬件故障时):比 SIGTERM 优雅关闭更罕见但可能发生,优雅关闭与快速启动共同支撑了高可用设计。
推荐用健壮队列后端(如 Beanstalkd),客户端断连或超时时任务自动归队;Crash-only design 把此概念推向逻辑终点。
Why · 为什么
原理 · Principle
快速启动与优雅关闭共同促成快速弹性扩展与频繁部署,DevOps 敏捷性基石,这使弹性扩展与频繁部署成为可能。
短启动时间使进程迁移到新物理机更容易、更安全,故障转移迅速,是生产环境健壮性的重要保障之一,任务与请求因此能在任何进程变更下安全完成。
优雅关闭隐含请求短暂可重连、任务可重入的架构要求,倒逼正确设计,崩溃或重启的影响被控制在最小范围,让进程迁移与故障恢复都快速而安全。
健壮应对突然死亡保证底层硬件故障下的可靠性不塌方,系统韧性,从机制上保证不丢任务、不重任务,优雅关闭与快速启动共同支撑了高可用设计。
How · 怎么做
把启动时间压到从启动命令到就绪仅数秒,保证弹性与迁移敏捷,这使弹性扩展与频繁部署成为可能,是生产环境健壮性的重要保障之一。
SIGTERM 到达时优雅关闭:web 停监听 + 完成当前请求;worker 归还当前任务,任务与请求因此能在任何进程变更下安全完成。
RabbitMQ worker 用 NACK 归还任务;Beanstalkd 断连自动归队,保证不丢任务。
锁型队列(Delayed Job)确保释放任务记录锁,避免任务卡死,崩溃或重启的影响被控制在最小范围。
任务用事务包裹或幂等化,保证崩溃后可重入,不重不丢,让进程迁移与故障恢复都快速而安全,从机制上保证不丢任务、不重任务。
用健壮队列后端(Beanstalkd)应对突然死亡:断连/超时自动归队,优雅关闭与快速启动共同支撑了高可用设计。
HTTP 保持短请求;长轮询客户端实现无缝重连,保证用户体验,使底层故障时系统依然能自动收敛恢复,这使弹性扩展与频繁部署成为可能。
案例 · Cases
| 代表性案例 |
|---|
| RabbitMQ NACK:worker 优雅关闭时归还当前任务到队列,任务不丢,这使弹性扩展与频繁部署成为可能。 |
| Beanstalkd:worker 断连时任务自动回到队列,健壮性设计,是生产环境健壮性的重要保障之一。 |
| Delayed Job:锁型系统需释放任务记录上的锁,防卡死,任务与请求因此能在任何进程变更下安全完成。 |
| Crash-only design(CouchDB 等):把突然死亡作为设计常态的逻辑终点,崩溃或重启的影响被控制在最小范围。 |
| 进程管理器在 SIGTERM 后把进程迁移到新物理机(得益于短启动),让进程迁移与故障恢复都快速而安全。 |
反模式 · Anti-patterns
- 启动时间长,拖慢 release 流程与扩容敏捷性,迁移困难,这使弹性扩展与频繁部署成为可能,是生产环境健壮性的重要保障之一。
- 收到 SIGTERM 不平滑退出——不完成当前请求、不归还任务,数据不保,任务与请求因此能在任何进程变更下安全完成。
- 任务不可重入/不幂等,崩溃后重复执行或任务丢失,一致性破坏,崩溃或重启的影响被控制在最小范围,让进程迁移与故障恢复都快速而安全。
- 依赖任务锁而不释放,导致任务卡死,队列阻塞,从机制上保证不丢任务、不重任务,优雅关闭与快速启动共同支撑了高可用设计。
实践资源 · 源码引用
| 路径 | 说明 |
|---|---|
| 08-source/app-content-en/disposability.md | IX. Disposability 原文:启动时间/SIGTERM 优雅关闭/队列归还/幂等/突然死亡/Crash-only |
| 08-source/app-content-en/processes.md | 进程可处置性主体的交叉引用 |
| 08-source/app-content-en/build-release-run.md | release 过程与扩容敏捷性的交叉引用 |