如何使用集群在heroku上正确缩放nodejs app

Fel*_*ino 11 heroku node.js

我注意到最近在heroku日志中发出警告说这对我来说似乎不太新鲜

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

web.1:推荐WEB_CONCURRENCY = 1

我做了一些研究,发现了这个集群文章,这是在nodejs中使用集群的"默认"方式,但它与包含这个新环境变量的新更新文章完全矛盾,WEB_CONCURRENCY并且每个dyno都有不同的大小建议(这是小一点,顺便说一下)

Tom*_*cer 7

第一个链接是从2014年7月开始,以前是推荐的做事方式.但是,Heroku的dynos是以内存为中心的,当使用每个CPU的最大内核数时,很容易超出分配的内存容量(正如第一篇文章所建议的那样).

相反,新建议是对您的应用进行概要分析,并确定每个进程需要多少内存.将环境变量WEB_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.
}
Run Code Online (Sandbox Code Playgroud)

通过使用WEB_MEMORY变量,Heroku可以WEB_CONCURRENCY根据您正在运行的dyno的大小生成一个值,从而分叉正确的进程数以确保您的应用程序不超过内存容量.

顺便说一句,如果你确实超过了内存分配(1x dyno每个dyno 512MB),交换空间将用于超额.这会降低您的应用程序速度,导致请求时间增加,并且通常会导致缓慢.如果超出内存使用量(约为分配的三倍),Heroku将重新启动你的d​​yno.