Clustering de aplicativos Node.js

Devido ao seu modelo de IO orientado a eventos e sem bloqueio , os aplicativos da web Node.js podem ser incrivelmente rápidos e responsivos , porque seu thread principal está livre para processar outras solicitações enquanto executa operações em segundo plano (como consultas de banco de dados, processamento de imagem, operações de sistema de arquivos , chamando outros serviços, etc.).

No entanto, uma única instância do Node está sempre em execução em um único thread, e há momentos em que você pode querer tirar proveito de sistemas multi-core, a fim de tornar seu aplicativo rápido ainda mais rápido. A boa notícia é que você pode facilmente balancear a carga de conexões de entrada em vários processos usando o módulo de cluster , virtualmente sem alteração em sua base de código existente.

Clustering de aplicativos Node.js

Suponha que o ponto de entrada do seu aplicativo seja um app.coffeearquivo parecido com este:

express = require 'express'
http
= require 'http'

app
= express()

app
.set 'port', env.PORT or 3000

...

# Start listening for incoming requests
http
.createServer(app).listen app.get('port'), ->
console
.log "Express server listening on port #{app.get('port')}"

Normalmente, você iniciaria seu aplicativo com algo assim $ coffee app.coffee.

Para habilitar o clustering, basta adicionar um start.jsarquivo semelhante a este:

require('coffee-script');
var cluster = require('cluster'),
env
= process.env,
i
;

cluster
.on('exit', function(worker) {
if (env.NODE_ENV == 'production') {
cluster
.fork();
}
});

if (cluster.isMaster) {
for (i = 0; i < env.CLUSTER_WORKERS; i++) {
cluster
.fork();
}
} else {
require('./app.coffee');
}

Não se esqueça de definir a CLUSTER_WORKERSvariável de ambiente para o valor desejado (ou seja, o número de núcleos que você deseja alocar, ou menos, se quiser manter alguns deles para outras tarefas) e simplesmente inicie seu aplicativo com $ node start.js.

No exemplo de código acima, também estou usando uma abordagem (muito) simplista para reiniciar automaticamente os trabalhadores no caso de erros não detectados.

Isso também faz sentido para aplicativos hospedados no Heroku , já que dizem que cada dinamômetro do Heroku tem quatro núcleos de CPU virtuais .
Não testei em outros provedores de PaaS, no entanto.