在Amazon ECS上的Docker中运行Node API的最佳方式是什么?

随着Docker和Amazon ECS等调度和编排服务的出现,我试图确定部署Node API的最佳方式。 抛开Docker和ECS,我想通过创build一个主进程和多个工作负载处理器,利用Node集群库在文档中build议的asynchronous错误的情况下正常处理崩溃节点应用程序。

集群方法的好处之一就是为每个可用的CPU创build一个工作者处理器。 但是这在docker世界是否有意义呢? 在单个docker容器中运行多个节点进程是否有意义,这个容器将被缩放到ECS上的EC2实例集群中?

如果没有Node集群方法,我将失去正常处理错误的能力,所以我认为至less应该为每个docker容器运行一个master和一个worker进程。 我仍然对ECS的任务定义中要定义的CPU数量感到困惑。 ECS文档中提到了每个CPU有1024个单元的容器实例; 但这与EC2计算单元不是一回事,是吗? 就这样说,我需要select适当数量的vCPU的EC2实例types来实现这个权利?

据我所知,实现最佳configuration可能需要一定程度的基准testing我的特定节点API应用程序,但是如果能够更好地了解从哪里开始,那将是非常棒的。 也许有一些学习/研究我需要做? 任何指引我的path或build议,将不胜感激!

编辑:回顾我的具体问题:

  1. 在Docker容器中运行一个主/从集群来实现优雅的崩溃是否合理?

  2. 使用与Cluster文档中描述的几乎相同的代码是否有意义,通过require('os').cpus().length来'缩放'到可用的require('os').cpus().length

  3. 在ECS任务定义的文档中,Amazon对于cpus设置的含义是什么意思,一个container instance has 1024 units per CPU ? 那么这个环境会是一个好的起点呢?

  4. 基于上述情况,针对旨在服务Node API的ECS集群,实例types有什么好的起点? 那么可用的vCPU如何影响以前的问题呢?

所有这些技术都是新的,最佳实践仍然在build立,所以考虑这些仅仅是我的经验。

每个容器一个进程比一个强硬的规则更重要。 在您使用容器时,可以在容器中运行多个进程,尤其是在主进程派生工人的情况下。 只要使用一个容器,并允许它为每个核心分叉一个进程,就像您在问题中所build议的那样。

在EC2上,实例types具有多个vCPU,这些vCPU将作为操作系统的核心出现。 对于ECS集群,使用EC2实例types(如c3.xlarge)和四个vCPU。 在ECS中,这转换为4096个CPU单元。 如果您希望应用程序使用全部4个vCPU,请创build一个需要4096个cpu单元的任务定义。

但是,如果你只是做这一切只是为了阻止应用程序崩溃,你也可以使用重新启动策略来重新启动容器,如果它崩溃。 看来ECS还不支持重启策略。

这似乎是一个非常好的模式。 这与Erlang / OTP所做的相似,我不认为有人会认为它是这个星球上最强大的系统之一。 现在的问题是如何实施。

我将利用来自Heroku或其他类似PaaS系统的模式,这些系统具有更多的成熟度。 我并不是说亚马逊是做这件事的错误地方,只是在其他可以翻译的领域已经做了很多工作。 例如,这篇文章有一个配方: https : //devcenter.heroku.com/articles/node-cluster

就vCPU和计算单位之间的关系而言,它看起来只是1/1024的正比率。 这是基于CPU利用率的微电荷的一个举措。 他们正在把这些更进一步的拉姆达工作。 他们正在基于你使用的一秒钟内收取费用。

在docker世界中,您将为每个docker容器运行1个nodejs,但是您将在每个ec2实例上运行许多这样的容器。 如果你使用像fig这样的东西,你可以使用fig scale <n>来运行许多冗余容器和一个实例。 这样,您不必提前定义您的nodejs数量,并且您的每个nodejs进程都与其他nodejs进程隔离。