Como Melhorar a Performance de Aplicações Node.js com Cluster

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.

Aplicação Node.js com Fastify utilizando Cluster

Aplicação Node.js com Fastify utilizando Cluster

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:

  1. Importamos os módulos necessários, incluindo “cluster” e “os”.
  2. Definimos “port” através de “env.PORT”.
  3. Se o processo for primário, ele bifurca vários processos de trabalho iguais ao número de núcleos de CPU disponíveis.
  4. 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:

Linhas de comandos da biblioteca autocannon

Linhas de comandos da biblioteca autocannon

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.

Teste de carga sem cluster

Teste de carga sem cluster


Resultado de teste de carga com Cluster: Sem Cluster, tivemos 1080k de requests e com 0 erros.

Teste de carga com cluster

Teste de carga com cluster


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.

Gostou do Conteúdo?

Explorar mais artigos

Pronto para transformar suas ideias em realidade?

Entre em contato para discutirmos seu projeto e como posso ajudar a alcançar seus objetivos.