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 novas instâncias como exige.

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.

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.

Usar recursos de dimensionamento automático internos. 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. 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.