Escalar através de adição de mais hardware até funciona bem se um aplicativo é multithreaded, ou se várias instâncias podem ser executadas em conjunto em uma mesma máquina. Sendo que adicionar mais hardware significa um acréscimo do consumo de memória e demais recursos associados principalmente se os processos forem pesados.
Distribuir o processamento em diferentes servidores funciona bem se o trabalho necessário para gerenciar a distribuição das requisições entre as várias máquinas for pequeno. O objetivo é manter cada máquina igualmente ocupada, como o investimento em mais hardware é desperdiçado se uma máquina estiver totalmente ocupada enquanto as demais estão ociosas. Distribuir a carga uniformemente entre várias máquinas é conhecido como balanceamento de carga.
|
É importante ressaltar que, para ambas as abordagens, a escalabilidade deve ser alcançada sem modificações na arquitetura da aplicação.
|
Na realidade, como a carga aumenta, as aplicações irão apresentar uma diminuição no throughput e um aumento exponencial no tempo de resposta. Isto acontece por duas razões.
|
Em primeiro lugar, com o aumento de carga, aumenta a disputa por recursos como CPU e memória por parte dos processos e threads na arquitetura do servidor.
|
Em segundo lugar, cada solicitação consome algum recurso adicional (espaço de buffer, locks, e assim por diante) e, eventualmente, estes recursos tornam-se esgotados o que limita a escalabilidade.
|
Apenas para ilustrar, a figura abaixo mostra como seis diferentes versões do mesmo aplicativo implementado usando diferentes servidores de aplicação JEE se comportam com um aumento de carga de 100 para 1.000 clientes.