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.
Suponha que o ponto de entrada do seu aplicativo seja um app.coffee
arquivo 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.js
arquivo 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_WORKERS
variá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.