快速启动和优雅终止可最大化健壮性
12-Factor 应用的进程是易处理(disposable)的,意思是说它们可以瞬间开启或停止。
这有利于快速、弹性的伸缩应用,迅速部署变化的代码或配置,稳健的部署应用。
进程应当追求最小启动时间。
理想状态下,进程从敲下命令到真正启动并等待请求的时间应该只需很短的时间。更少的启动时间提供了更敏捷的发布以及扩展过程,此外还增加了健壮性,因为进程管理器可以在授权情形下容易的将进程搬到新的物理机器上。
进程一旦接收终止信号(SIGTERM
)就会优雅的终止 。
就网络进程而言,优雅终止是指停止监听服务的端口,即拒绝所有新的请求,并继续执行当前已接收的请求,然后退出。此类型的进程所隐含的要求是 HTTP 请求大多都很短(不会超过几秒钟),而在长时间轮询中,客户端在丢失连接后应该马上尝试重连。
对于 worker 进程来说,优雅终止是指将当前任务退回队列。
例如,RabbitMQ 中,worker 可以发送一个 NACK
信号。 Beanstalkd 中,任务终止并退回队列会在 worker 断开时自动触发。有锁机制的系统诸如 Delayed Job 则需要确定释放了系统资源。此类型的进程所隐含的要求是,任务都应该可重复执行, 这主要由将结果包装进事务或是使重复操作幂等来实现。
进程还应当在面对突然死亡时保持健壮。
例如底层硬件故障。虽然这种情况比起优雅终止来说少之又少,但终究有可能发生。一种推荐的方式是使用一个健壮的后端队列,例如 Beanstalkd,它可以在客户端断开或超时后自动退回任务。无论如何,12-Factor 应用都应该可以设计能够应对意外的、不优雅的终结。Crash-only design 将这种概念转化为合乎逻辑的理论。
总结
好处
- 这有利于快速、弹性的伸缩应用,迅速部署变化的代码或配置,提高健壮性
- 进程应当追求最小启动时间,可以提供了更敏捷的发布以及扩展过程
- 进程一旦接收终止信号(SIGTERM) 就会优雅的终止
示例:
最佳实践
Docker 先天的轻量级和隔离性,就非常适合来做快速启动和优雅终止,Docker非常适合实践这条原则。
针对线上环境,推荐构建在容器云平台之上,可以更优雅的处理进程的启动和停止。
补充知识
扩展:SIGTERM、SIGKILL、SIGINT和SIGQUIT的区别
参考:
网友评论