问题说明:
我们公司用 docker 部署 rails 项目,部署在 AWS 的 ECS 上,我们一般会设置一个 health check 的 API endpoint,让 AWS 监控这个 container 是健康的。然而最近内部另外一个项目会突然发起大规模请求到当前 rails 项目上。那么 puma 的进程和线程都去处理请求了,GET /health
就会超时。AWS 会认为这个 container 是不健康的,不但没有 scale up,创建新的 containers,反而把正在忙的 container 给 kill 了。
这里牵涉到一个问题:如何判断一个 container 是正在忙碌,而不是真正死掉?
我假设的解决办法:
AWS 目前只支持 http ping,可以在 container 内加 nginx,nginx 链接两个后端,一个后端是 puma 进程,另外一个进程也是一个 http 程序,这个进程类似 god 负责检查 puma 的状态,如果 puma 是健康的,返回 /health 200,如果 puma 挂了,返回 503
Hack 一下 puma,让 puma 永远空出一个 thread 去处理 /health 请求,这样不管如何忙碌,只要 puma 不挂掉,/health 就永远可以有返回内容。
不知道大家的公司是如何 scaling rails 程序的,如何做 health check?