app 12 要素
####Codebase代码库 代码库和app一一对应。如果有多个代码库,就不是app而是分布式系统,每个代码库是分布式系统的一个组件。不同的app不应该分享代码,相同代码应该抽离后通过依赖管理工具引入。 app可以有不同的deploy,每个部署是相同代码库的一个运行实例。
####依赖管理 app应当显式的声明和隔绝依赖
####配置
- 后端资源
- 密码
- 和部署相关的变量 配置和代码必须分离,因为配置依赖于部署,代码不依赖于部署。代码库可以开源,不存在安全问题。 配置应当存储在环境变量中。
####后端服务 app不区分本地和第三方服务,都是附加资源。
####编译发布运行
- 编译生成可执行文件
- 发布包含编译结果和配置
- 运行阶段在指定环境运行发布结果 三者严格分离。例如,部署新代码触发编译,发布新版本触发发布,系统重启触发运行。
####进程 多进程间是无状态的,不共享资源。需要持久化的数据存储在后端服务中。内存空间和文件系统只能用作简单缓存。
####端口绑定 app通过绑定端口开放服务
####并行 采用unix进程模型,unix服务器守护进程有一个入口,webapp通常有多个入口,每个入口是一个进程类型,不同进行类型负责不同的工作负荷。例如http请求flask,后台任务celery。这样更有利于水平扩展。
####可丢弃 进程可以随时启动和停止。要求快速启动。web进程关闭时不接受新连接,处理现有连接。工作进程把正在处理的任务返回给管理器。(任务可重入)
####开发生产对等 保持开发生产对等以便持续开发。不应该使用不同的后端服务。
####日志 日志是连续的时间序列事件。app不应该管理日志文件,只需要输出到标准输出上。日志文件由执行环境管理。日志流可以通过splunk索引分析,也可以存入HIVE。
####管理进程 使用单次进程运行管理任务。