Call Stack Cada chamada de função/operação gera uma entrada na callstack do motor do JavaScript. Essa pilha de execução enche e esvazia conforme a aplicação é executada, de forma síncrona. Memory Heap Call Stack
Callback Queue Uma pilha de execução similar a call stack, porém sua execução é assíncrona. Callback Queue Memory Heap Call Stack Conforme a callback queue “esvazia”, a call stack “enche”
Event Loop O Event Loop é o responsável por coletar esses eventos e adicioná-los a call stack. Callback Queue Call Stack Event Loop Referências: https://bit.ly/33Rn3CX Veja funcionando: http://latentflip.com/loupe/
Operações Bloqueantes Apesar dessas características, as operações executadas no JavaScript são concorrentes. Ou seja, concorrem entre si para saber em que momento podem ser executadas. Apenas uma operação ocorre por vez. https://bit.ly/32SAP6Q
Teste de carga Uma simples operação bloqueante de 5 segundos foi capaz de prejudicar a performance da aplicação em 99,96% Sem Blocking Com Blocking (5s) 51.415 req/10s 18 req/10s 5145 req/s 1,8 req/s https://bit.ly/2CTdpDL
Node.js Cluster Mode Um cluster é resumidamente um processo que age como balanceador de carga para subprocessos. Sub Process Sub Process Sub Process Sub Process Main Process / Service
Node.js Cluster Mode Cluster não é multi-thread. Cada processo ainda sofrerá com ações bloqueantes, entretanto o balanceador de carga terá como distribuir as requisições paralelas em outros processos enquanto um estiver “ocupado”. Sub Process Sub Process Sub Process Sub Process Main Process / Service m ulti-thread
Escalabilidade + CPU +Memória ... Vertical Horizontal +Máquinas / +Instâncias Uma estratégia de escalabilidade deve ser tomada para garantir performance e disponibilidade da aplicação.
Escalabilidade Vertical + CPU +Memória ... Vertical Se resume a aumentar as capacidades de uma única instância / máquina onde a aplicação é executada. Apesar de simples, tem custos elevados no longo prazo, e não garante disponibilidade.
Escalabilidade Horizontal Horizontal +Máquinas / +Instâncias Ao optar por incrementar a quantidade de máquinas / instâncias de uma aplicação haverá uma maior disponibilidade. Caso uma máquina falhe, a aplicação continuará disponível.
Escalabilidade Horizontal Horizontal +Máquinas / +Instâncias Esta estratégia garante uma maior disponibilidade. Caso uma máquina falhe, a aplicação continuará disponível.
Escalabilidade Horizontal Nesta arquitetura, as requisições não chegam diretamente nas instâncias. Um balanceador de carga é o responsável por determinar para onde a requisição deve ir. A B C D E F Load Balancer Requests
Escalabilidade Horizontal IMPORTANTE: Recursos como banco, cache entre outros, devem ser compartilhados entre as instâncias. A B C D E F Load Balancer Recursos compartilhados
Conclusão Apesar de suas particularidades, com alguns ajustes, Node.js (e outras soluções) têm a capacidade de escalar e entregar alta disponibilidade.