12 Factor 方法论合并知识图谱 / 分组目录 / 12 Factor App 体系 / 可处置性

可处置性

App 体系进阶方法原则GA · 12 Factor App 体系

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

相关边

实践资源 · 源码引用

路径说明
08-source/app-content-en/disposability.mdIX. Disposability 原文:启动时间/SIGTERM 优雅关闭/队列归还/幂等/突然死亡/Crash-only
08-source/app-content-en/processes.md进程可处置性主体的交叉引用
08-source/app-content-en/build-release-run.mdrelease 过程与扩容敏捷性的交叉引用