12 Factor 方法论合并知识图谱 / 分组目录 / 12 Factor App 体系 / 管理进程

管理进程

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

What · 是什么

管理/维护任务作为一次性进程运行
process formation 是应用运行时做常规业务(如处理 web 请求)的进程数组;开发者还常想对应用做一次性管理/维护任务。
一次性任务例子:数据库迁移,Django 用 manage.py migrate、Rails 用 rake db:migrate。
一次性任务例子:运行 console(REPL shell)执行任意代码或对实时数据库检查模型;多数语言无参运行解释器即得 REPL(python、perl),或独立命令(Ruby 的 irb、Rails 的 rails console)。
一次性任务例子:运行提交进应用 repo 的一次性脚本,如 php scripts/fix_bad_records.php 修复坏数据。
一次性 admin 进程应在与常规长跑进程相同的环境中运行,针对某个 release 运行,这保证管理操作与线上环境完全一致。
admin 进程使用与该 release 任何进程相同的 codebase 与 config,保证操作的是线上同款数据环境。
admin 代码必须随应用代码一起发布,以避免同步问题,保证版本一致,是数据迁移与修复类操作安全性的前提。
所有进程类型应使用相同的依赖隔离技术:Ruby web 进程用 bundle exec thin start,则数据库迁移用 bundle exec rake db:migrate。
Python 用 Virtualenv 的应用,Tornado webserver 与 manage.py admin 进程都应使用 vendored 的 bin/python。
十二要素强烈偏好开箱即提供 REPL shell、且便于运行一次性脚本的语言,减少开发摩擦,管理任务因此可重复、可预期、可审计。
本地 deploy:开发者在应用检出目录内用直接 shell 命令调用一次性 admin 进程,简单直接。
生产 deploy:开发者可用 ssh 或该 deploy 执行环境提供的远程命令执行机制运行此类进程。

Why · 为什么

原理 · Principle

一次性任务(迁移/REPL/脚本)需生产同环境才能正确操作线上数据,环境不符必出错,这保证管理操作与线上环境完全一致。

admin 代码随应用发布避免同步问题,版本永远一致,是数据迁移与修复类操作安全性的前提,管理任务因此可重复、可预期、可审计。

依赖隔离一致保证 admin 进程与长跑进程环境完全一致,行为可预期,避免管理脚本与线上环境脱节造成事故。

How · 怎么做

数据库迁移、REPL console、一次性修复脚本都作为一次性进程运行,与长跑进程同级,这保证管理操作与线上环境完全一致。
admin 进程针对 release 运行,使用与长跑进程相同的 codebase 与 config。
admin 代码随应用代码一起发布,杜绝版本漂移,是数据迁移与修复类操作安全性的前提,管理任务因此可重复、可预期、可审计。
所有进程类型用相同依赖隔离技术(bundle exec、vendored bin/python),环境一致。
本地用 shell 直接命令,生产用 ssh 或远程执行机制,按环境选择通道,避免管理脚本与线上环境脱节造成事故。

案例 · Cases

代表性案例
manage.py migrate(Django)数据库迁移,管理任务典型,这保证管理操作与线上环境完全一致。
rake db:migrate(Rails)数据库迁移,同属管理任务,是数据迁移与修复类操作安全性的前提。
REPL:python、perl 无参运行;irb(Ruby)、rails console(Rails)独立命令。
php scripts/fix_bad_records.php:提交进 repo 的一次性脚本,修复线上数据。
bundle exec rake db:migrate 与 bundle exec thin start 同源依赖隔离,环境一致。
Virtualenv 应用的 vendored bin/python 同时运行 Tornado 与 manage.py,统一解释器。

反模式 · Anti-patterns

相关边

实践资源 · 源码引用

路径说明
08-source/app-content-en/admin-processes.mdXII. Admin processes 原文:迁移/REPL/一次性脚本/同环境同 release/依赖隔离一致/本地 shell 生产 ssh
08-source/app-content-en/concurrency.mdprocess formation 概念来源
08-source/app-content-en/build-release-run.mdadmin 进程针对 release 运行的交叉引用
08-source/app-content-en/dependencies.md依赖隔离技术在 admin 进程的应用