Node.js 集群与多个 Docker 容器的区别

19
据我所了解,Docker容器使用多个线程,而Node.js应用程序仅使用单个线程。通过运行像pm2这样处理Node.js集群的工具,我可以利用Docker容器中所有可用的核心。
这是否意味着我可以通过聚合Node.js进程来更充分利用每个Docker实例?如果是这样,那么相对于每个容器仅运行单个线程的Node.js实例,这不是更好的选择吗?
一个担忧是,Docker容器可能会因为正在运行的CPU数量的增加或减少而导致副作用。
3个回答

20

7
需要注意的是,那里明确提到的最佳选择带有集群支持的多个容器,即每个容器中都有一个运行Node集群的Docker容器(每个容器中有4个进程)。 - Milan Velebit
3
@stefanobaldo提供的链接只是指向另一个问题,没有任何证据,而且该问题已经过时,因为没有提到dock-compose scale选项或kubernetes。 - MADforFUNandHappy

1

首先,你并不一定需要使用pm2来运行node集群。node自带clusters模块,可以利用多核机器。此外,缩减实例数量并不会产生影响,除非你硬编码了工作进程数。请参考clusters模块中的示例代码,了解如何使用clusters生成工作进程。


我认为这个问题是关于集群与多个Docker容器而不是应用程序集群本身的区别 - pm2只是一个例子 :-) - stefanobaldo

1
如果你想要在另一个docker组件中对NodeJS进行集群化,我认为这不会给你带来额外的提升。像你所说的,NodeJS在单个线程中运行,因此无论是使用pm2(我实际上使用它)还是docker,在分配负载方面都会产生相同的效果。
NodeJS具有Web工作线程的概念,以处理它如何处理传入的请求,但即使是速度不太快的服务器也可以处理数百个请求,因为它是非阻塞架构。
我承认我仍需要深入了解Docker,但我没有时间,但我会为每个服务器(虚拟或物理)设置1个docker镜像,然后让pm2在其中运行多个node实例。
这样做的原因是我希望Docker为我处理依赖项,并且我希望pm2处理集群管理,因为它具有很酷的功能,例如当内存达到目标时自动重新启动或重新启动出现错误的节点。

“NodeJS有Web Workers的概念”是什么意思? - Ates Goral
也许“Web Workers”不是最恰当的术语,但我指的是您可以配置的maxSockets:http.globalAgent.maxSockets。 - sebastianf182

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接