Design para escalar horizontalmente
Desenvolva seu aplicativo para que ele possa ser colocado em escala horizontalmente
Uma vantagem importante da nuvem é a escala elástica: a habilidade de usar tanta capacidade quanto necessário, escalar horizontalmente conforme a carga aumenta e reduzir horizontalmente quando a capacidade extra não for necessária. Crie seu aplicativo para que ele possa ser dimensionado horizontalmente, adicionando ou removendo instâncias, adequando a oferta à demanda.
A escalabilidade é medida pela proporção entre o ganho de throughput e o aumento de recursos. Idealmente, em um sistema bem projetado, ambos os números são proporcionais: uma alocação dupla de recursos dobrará o throughput. A escalabilidade é normalmente limitada pela introdução de gargalos ou pontos de sincronização no sistema.
Recomendações
Evitar a adesão de instância. Adesão ou afinidade de sessão, é quando as solicitações do mesmo cliente sempre são roteadas para o mesmo servidor. A adesão limita a capacidade do aplicativo de escalar horizontalmente. Por exemplo, o tráfego de um usuário de alto volume não será distribuído entre instâncias. Causas de adesão incluem armazenamento de estado de sessão na memória e usar chaves específicas de computador para a criptografia. Todas as instâncias devem conseguir lidar com uma solicitação.
Identificar gargalos. Escalar horizontalmente não é uma correção mágica para todos os problemas de desempenho. Por exemplo, se seu banco de dados de back-end for o gargalo, não adiantará adicionar mais servidores Web. Primeiro identifique e resolva os gargalos do sistema antes de lançar mais instâncias no problema. Partes com estado do sistema são a causa mais provável de gargalos.
Decompor cargas de trabalho por requisitos de escalabilidade. Os aplicativos geralmente consistem em várias cargas de trabalho, com diferentes requisitos de dimensionamento. Por exemplo, um aplicativo pode ter um site voltado ao público e um site de administração separados. O site público pode apresentar surtos repentinos no tráfego, enquanto o site de administração tem uma carga menor e mais previsível.
Projete componentes autônomos e desacoplados que se comunicam por meio de protocolos de comunicação assíncronos. Idealmente, os componentes devem ter seu próprio estado independente e usar eventos para comunicar qualquer alteração ou atividade a componentes externos. Isso ajuda a escalar de forma independente apenas o componente sobrecarregado. Implemente mecanismos de controle de fluxo para gerenciar o tráfego e degradar normalmente. Os consumidores devem controlar sua própria taxa de consumo. Os produtores devem controlar sua própria taxa de transmissão, incluindo a parada. As filas de mensagens são boas opções para absorver a carga de trabalho extra e permitir que os consumidores drenem o trabalho à vontade.
Evite comunicação, coordenação e espera desnecessárias.
Descarregue tarefas assíncronas naturalmente. Tarefas como envio de e-mails, ações em que o usuário não precisa de uma resposta imediata e integração com outros sistemas são boas opções para fazer uso de padrões de mensagens assíncronas.
Descarregar tarefas com uso intenso de recursos. As tarefas que exigem muitos recursos de CPU ou E/S devem ser movidas para trabalhos em segundo plano quando possível para minimizar a carga no front-end que está manipulando as solicitações do usuário.
Escala automática com base em métricas de uso ao vivo e uso de recursos internos de dimensionamento automático. Muitos serviços de computação do Azure têm suporte interno para dimensionamento automático. Se o aplicativo tem uma carga de trabalho previsível e regular, escale horizontalmente conforme um agendamento. Por exemplo, aumente durante o horário comercial. Caso contrário, se a carga de trabalho não for previsível, use métricas de desempenho, como comprimento da fila de solicitação ou CPU para disparar o dimensionamento automático. Observe os aplicativos e suas comunicações para identificar gargalos e obter decisões mais precisas. Para melhores práticas sobre dimensionamento automático, consulte Dimensionamento automático.
Considere dimensionamento automático agressivo para cargas de trabalho críticas. Para cargas de trabalho críticas, você deseja se manter à frente de demanda. É melhor adicionar novas instâncias rapidamente quando a carga está pesada para lidar com o tráfego adicional e, quando necessário, reduzir novamente gradualmente.
Design para reduzir horizontalmente. Lembre-se de que, com a escala elástica, o aplicativo terá períodos de redução horizontal, quando as instâncias são removidas. O aplicativo deve tratar normalmente instâncias que estão sendo removidas. Aqui estão algumas maneiras de tratar a redução horizontal:
- Escutar eventos de desligamento (quando disponíveis) e desligar corretamente.
- Clientes/consumidores de um serviço devem dar suporte a tratamento de falhas transitórias e novas tentativas.
- Para tarefas de longa execução, considere dividir o trabalho, usando pontos de verificação ou o padrão Pipes e Filtros.
- Coloque os itens de trabalho em uma fila para que outra instância possa assumir o trabalho se uma instância for removida no meio do processamento.
Considere o dimensionamento para redundância. O dimensionamento horizontal pode melhorar a confiabilidade do seu aplicativo. Por exemplo, dimensione em várias zonas de disponibilidade, como usando serviços com redundância de zona. Essa abordagem pode melhorar a taxa de transferência do aplicativo, bem como fornecer resiliência se uma zona enfrentar uma interrupção.
Modele e otimize a escalabilidade do seu sistema. Você pode usar o modelo do seu sistema usando uma abordagem como a lei de Amdahl. Quantifique a escalabilidade com base em parâmetros como contenção e coerência. Contenção refere-se ao atraso devido à espera ou enfileiramento de recursos compartilhados. Coerência refere-se ao atraso para que os dados se tornem consistentes. Por exemplo, ter uma alta contenção indica processamento sequencial que pode ser paralelizado, enquanto ter uma alta coerência sugere dependências excessivas entre os processos, solicitando que você minimize as interações. Durante o projeto da carga de trabalho, você pode calcular a capacidade efetiva máxima do seu sistema para evitar fornecer mais oferta do que demanda, o que leva a um desperdício.