【发布时间】:2015-05-10 15:28:59
【问题描述】:
我正在重构几个 node.js 服务。所有这些都过去在虚拟服务器上以forever 开头,如果进程崩溃,它们只是重新启动。
现在,转向容器化和无状态应用程序结构,我认为进程应该退出并且容器应该在失败时重新启动。
正确吗?有好处还是坏处?
【问题讨论】:
标签: node.js docker coreos microservices
我正在重构几个 node.js 服务。所有这些都过去在虚拟服务器上以forever 开头,如果进程崩溃,它们只是重新启动。
现在,转向容器化和无状态应用程序结构,我认为进程应该退出并且容器应该在失败时重新启动。
正确吗?有好处还是坏处?
【问题讨论】:
标签: node.js docker coreos microservices
如果您在具有多个 CPU 的服务器上运行,则节点需要集群设置。
使用 PM2,您无需编写任何额外代码即可实现这一目标。 http://pm2.keymetrics.io/docs/usage/cluster-mode/
除非您使用一堆具有单 CPU 实例的服务器,否则我会说在生产中使用 PM2。
pm2 也会比 docker 更快重启
【讨论】:
虽然使用--restart=always 作为故障保护是个好主意,但容器重启相对较慢(使用here 描述的简单Hello World Node 服务器需要5 秒以上),因此您可以使用@987654325 之类的方法最大限度地减少应用程序停机时间@。
在容器中重新启动进程的一个缺点是崩溃恢复现在可以两种方式发生,这可能会对您的监控等产生影响。
【讨论】:
我的看法是不要使用容器内进程管理器(永远,pm2),而是通过--restart=always(或该选项的其他风格之一)使用 docker restart 策略。这更符合 docker 的整体理念,并且应该与容器内进程监督非常相似,因为 docker 容器开始运行非常快。
如果您想探索关于此主题的其他立场,我见过的运行容器内进程监督的最强有力的倡导者是phusion baseimage-docker README。
【讨论】: