我正在重构几个Node.js服务。它们所有以前都是在虚拟服务器上使用forever
启动,如果进程崩溃,就会重新启动。
现在,转移到容器化和无状态应用程序结构,我认为进程应该在失败时退出,容器应该重新启动。
这样做是否正确?有什么好处或缺点吗?
我正在重构几个Node.js服务。它们所有以前都是在虚拟服务器上使用forever
启动,如果进程崩溃,就会重新启动。
现在,转移到容器化和无状态应用程序结构,我认为进程应该在失败时退出,容器应该重新启动。
这样做是否正确?有什么好处或缺点吗?
我的建议是不要使用容器内的进程监视器(如forever、pm2),而是使用Docker重启策略,通过--restart=always
命令选项(或其他变体)实现。这更符合整体的Docker理念,并且应该与容器内进程监视非常相似,因为Docker容器启动速度非常快。
对于在容器内运行进程监视的最强支持者,我见过的是phusion baseimage-docker README,如果你想探索此主题的其他立场,请查看该文档。
尽管使用--restart=always
作为安全机制是个好主意,但重启容器相对较慢(如在此处描述的简单Hello World Node服务器中需要5秒或更长时间),因此您可以使用forever
之类的工具来最小化应用程序停机时间。
在容器内重新启动进程的一个缺点是崩溃恢复现在可以以两种方式进行,这可能会影响您的监控等方面。
如果您在多个CPU的服务器上运行,则需要对Node进行群集设置。
使用PM2,您无需编写任何额外的代码即可实现此功能。 http://pm2.keymetrics.io/docs/usage/cluster-mode/
除非您正在使用多个单CPU实例的服务器,否则我建议在生产中使用PM2。
与Docker相比,PM2的重新启动速度也更快。