介绍
在现代,软件通常以服务的形式提供:称为Web 应用程序或软件即服务。十二要素应用程序是一种构建软件即服务应用程序的方法,它:
- 使用声明性格式进行设置自动化,以最大限度地减少新开发人员加入项目的时间和成本;
- 与底层操作系统有清晰的契约,在执行环境之间提供最大的可移植性;
- 适合部署在现代云平台上,无需服务器和系统管理;
- 最大限度地减少开发和生产之间的差异,实现持续部署以实现最大灵活性;
- 并且可以在不对工具、架构或开发实践进行重大更改的情况下进行扩展。
十二因素方法可应用于用任何编程语言编写的应用程序,并使用任何组合的支持服务(数据库、队列、内存缓存等)。
背景
本文档的贡献者直接参与了数百个应用程序的开发和部署,并通过在Heroku平台上的工作间接见证了数十万个应用程序的开发、运行和扩展。
本文档综合了我们对各种软件即服务应用的所有经验和观察。它是对应用开发理想实践的三角测量,特别关注应用随时间推移的有机增长动态、应用代码库开发人员之间的协作动态,以及避免软件侵蚀的成本。
我们的动机是提高人们对现代应用程序开发中发现的一些系统性问题的认识,提供讨论这些问题的共享词汇表,并提供一系列针对这些问题的广泛概念解决方案和相关术语。格式灵感来自 Martin Fowler 的书籍《企业应用程序架构模式和重构》 。
谁应该阅读此文档?
任何开发以服务形式运行的应用程序的开发人员。部署或管理此类应用程序的 Ops 工程师。
十二个因素
一、代码库
在修订控制中跟踪一个代码库,进行多次部署
二、依赖关系
明确声明并隔离依赖项
三、配置
将配置存储在环境中
四、后备服务
将支持服务视为附加资源
五、构建、发布、运行
严格区分构建和运行阶段
六、进程
以一个或多个无状态进程运行应用
运行环境中,应用程序通常是以一个和多个 进程 运行的。
最简单的场景中,代码是一个独立的脚本,运行环境是开发人员自己的笔记本电脑,进程由一条命令行(例如python my_script.py
)。另外一个极端情况是,复杂的应用可能会使用很多进程类型,也就是零个或多个进程实例。
12-Factor 应用的进程必须无状态且无共享。 任何需要持久化的数据都要存储在后端服务内,比如数据库。
内存区域或磁盘空间可以作为进程在做某种事务型操作时的缓存,例如下载一个很大的文件,对其操作并将结果写入数据库的过程。12-Factor应用根本不用考虑这些缓存的内容是不是可以保留给之后的请求来使用,这是因为应用启动了多种类型的进程,将来的请求多半会由其他进程来服务。即使在只有一个进程的情形下,先前保存的数据(内存或文件系统中)也会因为重启(如代码部署、配置更改、或运行环境将进程调度至另一个物理区域执行)而丢失。
源文件打包工具(Jammit, django-compressor) 使用文件系统来缓存编译过的源文件。12-Factor 应用更倾向于在构建步骤做此动作——正如Rails资源管道,而不是在运行阶段。
一些互联网系统依赖于 “粘性 session”, 这是指将用户 session 中的数据缓存至某进程的内存中,并将同一用户的后续请求路由到同一个进程。粘性 session 是 12-Factor 极力反对的。Session 中的数据应该保存在诸如Memcached或Redis这样的带有过期时间的缓存中。