如何使用集群正确缩放heroku上的nodejs应用程序

最近我注意到了Heroku日志中的一个警告,说这对我来说似乎是新的

web.1:检测到512 MB可用内存,每个进程512 MB限制(WEB_MEMORY)

web.1:推荐WEB_CONCURRENCY = 1

我做了一些研究,发现了这个集群文章 ,这是在nodejs中使用集群的“默认”方式,但它与包含这个新的WEB_CONCURRENCY环境variables的新更新的文章完全矛盾,并且针对每个WEB_CONCURRENCY有不同的大小build议是小得多,顺便说一句)

第一个环节是从2014年7月起,曾经是推荐的做事方式。 然而,Heroku的dynos是相当以内存为中心的,当使用每个CPU的最大内核数量时(如第一篇文章所示),超出分配的内存容量是非常容易的。

相反,新的build议是分析您的应用程序,并找出每个进程需要多less内存。 将环境variablesWEB_MEMORY设置为此值,然后将您的群集代码更新为以下内容:

 var cluster = require('cluster'); var numWorkers = process.env.WEB_CONCURRENCY; if(cluster.isMaster) { // Master process: fork our child processes for (var i = 0; i < numWorkers; i++) { cluster.fork(); } // Respawn any child processes that die cluster.on('exit', function() { cluster.fork(); }); } else { // Child process, put app initialisation code here. } 

通过使用WEB_MEMORYvariables,Heroku可以生成一个WEB_CONCURRENCY值,具体取决于您正在运行的WEB_CONCURRENCY的大小,因此需要分配正确数量的进程以确保您的应用程序不会超出内存容量。

另外,如果超过了内存分配(对于1x dyno,每个dyno 512MB),交换空间将用于超出部分。 这会减慢您的应用程序,导致请求时间增加,通常会导致缓慢。 如果你的内存使用量太大(大约是分配的三倍),Heroku会重新启动你的d​​yno。

节点具有有限的扩展到不同容器大小的能力。 它是单线程的,所以它不能自动利用额外的CPU核心。 此外,它是基于V8的 – 它有一个大约1.5 GB的硬盘内存限制 – 所以它也不能自动利用额外的内存。

相反,Node.js应用程序必须分叉多个进程才能最大化其可用资源。 这称为“集群”,并受Node.js集群API的支持。 您可以直接在您的应用程序中调用Cluster API,也可以使用API​​中的许多抽象中的一种。

heroku中的一篇好文章指定了如何使用throng模块启用并发