22

随着 docker 以及 Amazon ECS 等调度和编排服务的出现,我正在尝试确定部署 Node API 的最佳方式。除了 Docker 和 ECS,我想利用 Node 集群库,通过创建一个主进程和多个工作处理器来优雅地处理在文档中建议的异步错误事件中节点应用程序的崩溃。

除了优雅地处理错误之外,集群方法的好处之一是为每个可用的 CPU 创建一个工作处理器。但这在 docker 世界中有意义吗?在一个 Docker 容器中运行多个节点进程是否有意义,该容器将被扩展到 ECS 上的 EC2 实例集群中?

如果没有 Node 集群方法,我将失去优雅处理错误的能力,因此我认为至少应该为每个 docker 容器运行一个主进程和一个工作进程。我仍然对在 ECS 的任务定义中定义多少 CPU 感到困惑。ECS 文档说明了每个容器实例每个 CPU 有 1024 个单元;但这与 EC2 计算单元不同,是吗?话虽如此,我需要选择具有适当数量的 vCPU 的 EC2 实例类型来实现这一点吗?

我知道实现最佳配置可能需要对我的特定 Node API 应用程序进行某种程度的基准测试,但如果能更好地了解从哪里开始,那就太棒了。也许我需要做一些学习/研究?任何指导我的路径或建议的指针将不胜感激!

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

  1. 如此处所述在docker 容器内运行主/从集群以实现优雅崩溃是否有意义?

  2. 使用集群文档中描述的几乎相同的代码来“扩展”到可用的 CPU 是否有意义require('os').cpus().length

  3. 亚马逊在 ECS 任务定义的文档中是什么意思,它对cpus设置说,a container instance has 1024 units per CPU?这个设置的一个好的起点是什么?

  4. 将实例类型用于 ECS 集群的一个好的起点是什么,该集群旨在为基于上述内容的节点 API 提供服务?可用的 vCPU 对前面的问题有何影响?

4

3 回答 3

5

所有这些技术都是新的,最佳实践仍在建立中,所以这些只是我的经验提示。

每个容器一个进程与其说是硬性规定,不如说是一种建议。当你使用它时,在一个容器中运行多个进程是很好的,特别是在这种情况下,一个主进程分叉工作人员。正如您在问题中所建议的那样,只需使用一个容器并允许它为每个核心分叉一个进程。

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

但是,如果您这样做只是为了阻止应用程序崩溃,您也可以在容器崩溃时使用重启策略来重启容器。不过,ECS 似乎还不支持重启策略。

于 2014-12-30T04:36:48.573 回答
1

这似乎是一个非常好的模式。它类似于使用 Erlang/OTP 所做的事情,我认为没有人会争辩说它是地球上最强大的系统之一。现在的问题是如何实施。

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

就 vCPU 和计算单元之间的关系而言,它看起来只是 1/1024 的直接比率。这是一种基于 CPU 利用率的微收费。他们通过 lambda 工作将这些更进一步。他们根据您使用的几分之一秒向您收费。

于 2014-12-25T19:37:16.463 回答
0

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

于 2014-12-21T01:09:01.723 回答