Como Melhorar a Performance de Aplicações Node.js com Cluster
Ao implementar o módulo de cluster do Node.js, obtive 2,64 mais desempenho. Esse resultado foi INCRÍVEL!
Compreendendo o Cluster
O "Cluster" foi introduzido para escalar a execução de um aplicativo em vários núcleos de processador, criando processos de trabalho (workers). Cada worker opera como um processo Node.js independente, compartilhando a mesma porta de servidor e utilizando eficientemente os núcleos de CPU disponíveis. O processo primário gerencia os workers e distribui as solicitações de entrada utilizando a abordagem "ROUND-ROBIN".
- ROUND-ROBIN: O processo primário escuta em uma porta e distribui uniformemente a carga de trabalho para garantir que nenhum processo fique sobrecarregado. Esta é a abordagem padrão em todos os sistemas operacionais, exceto no Windows.
Benefícios do Clustering:
- Todos os núcleos disponíveis podem ser utilizados para execução de aplicativos, aumentando o desempenho.
- Se um processo de trabalho falhar, podemos identificar e criar um novo processo automaticamente.
- As solicitações recebidas são distribuídas entre vários processos de trabalho, garantindo uma carga de trabalho equilibrada.
Exemplo de uso: O exemplo abaixo foi desenvolvido com Node.js e framework Fastify.
Neste exemplo, o processo primário cria processos de trabalho com base no número de núcleos de CPU disponíveis. Visualizar repositório exemplo no Github.
Aqui está uma análise do código:
- Importamos os módulos necessários, incluindo “cluster” e “os”.
- Definimos “port” através de “env.PORT”.
- Se o processo for primário, ele bifurca vários processos de trabalho iguais ao número de núcleos de CPU disponíveis.
- Se o processo de trabalho (worker) falhar, captamos o evento e criamos um novo processo automaticamente.
Comparando uso do Cluster com Teste de Carga:
O teste de carga avalia o desempenho de um aplicativo sob várias cargas de trabalho. Neste exemplo utilizaremos a biblioteca autocannon para realizar teste de carga e avaliar o desempenho.
Primeiro Passo: Criaremos um arquivo na raiz do projeto com o nome “bench.sh” e inseriremos os seguintes comandos:
Segunda Passo:
Abriremos o terminal e executaremos o seguinte comando: bash bench.sh.
Neste exemplo, simulamos 500 conexões simultâneas durante 15 segundos, com 10 requisições em paralelo por conexão.
Resultado de teste de carga sem Cluster:
Sem Cluster, tivemos 409k de requests e com 135 erros.
Resultado de teste de carga com Cluster: Sem Cluster, tivemos 1080k de requests e com 0 erros.
Conclusão:
Implementar o módulo de cluster no Node.js pode transformar significativamente o desempenho das suas aplicações, como evidenciado por um aumento de aproximadamente 2,64 vezes no desempenho em nossos testes. Esta melhoria notável destaca o potencial do cluster para maximizar a utilização dos recursos do sistema, distribuindo eficientemente a carga de trabalho entre múltiplos processos de trabalho.
Observação importante:
O uso do cluster irá depender muito do cenário atual da aplicação, talvez o ideal seja utilizar outras opções como kubernetes.