Tornar as aplicações dimensionáveis

Concluído

Agora que você entende os conceitos básicos da preparação para o crescimento e está ciente dos fatores a serem considerados no planejamento de capacidade, pode aceitar o desafio de tornar seus aplicativos o mais escaláveis possível.

Análises de arquitetura

Um ponto fundamental a ter em conta é que deve efetuar análises de arquitetura regulares dos seus sistemas.

Você sabe que pode aplicar práticas como infraestrutura como código para melhorar a forma como implanta seus recursos de nuvem. Pode atualizar e melhorar o código da aplicação regularmente e deve fazer o mesmo com os recursos subjacentes da plataforma.

Realizar uma análise da arquitetura ajuda a identificar as áreas que precisam de ser melhoradas.

O Centro de Arquitetura do Azure tem uma grande variedade de recursos para ajudá-lo a arquitetar seus aplicativos na nuvem, e há muitas recomendações de escalabilidade que você pode encontrar no guia de arquitetura de aplicativos no seguinte link:

Centro de Arquitetura do Azure

Cenário: arquitetura Tailwind Traders

O primeiro passo é fazer uma avaliação da arquitetura e aplicação, não só para determinar onde estão as fraquezas, mas também para reconhecer os seus pontos fortes. Quais são os aspetos positivos?

Observe novamente o cenário que viu na unidade anterior. Aqui está um diagrama da arquitetura da organização novamente.

Full architecture diagram of application with products backend highlighted.

Eles decompuseram o aplicativo em microsserviços menores, e alguns desses serviços estão sentados como contêineres no Serviço Kubernetes do Azure ou podem estar sendo executados em VMs ou Serviço de Aplicativo. Você está usando alguns serviços inerentemente escaláveis , como Funções e Aplicativos Lógicos.

Esta alteração é boa, mas existem algumas melhorias que tornariam a aplicação mais dimensionável. Como exemplo, concentre-se no serviço de produtos. No diagrama, o serviço do produto está sendo executado no Kubernetes, mas assumimos, para esta explicação, que ele está sendo executado em uma VM no Azure. Os conceitos de dimensionamento, possivelmente com uma implementação ligeiramente diferente, podem ser aplicados a aplicativos, estejam eles sendo executados em servidores, Serviço de Aplicativo ou em contêineres.

Atualmente, o produto é executado em uma única VM, conectada a um único banco de dados SQL do Azure. Você precisa habilitar essa VM para expansão. Você pode fazer isso usando conjuntos de escala de máquina virtual do Azure, que permitem criar e gerenciar um grupo de VMs idênticas com balanceamento de carga. Como agora você tem mais de uma VM, precisa introduzir um balanceador de carga para distribuir o tráfego entre as VMs.

Conjuntos de dimensionamento de máquinas virtuais

Ao aplicar conjuntos de dimensionamento de máquina virtual em VMs únicas, você obtém alguns benefícios:

  • Você pode dimensionar automaticamente com base em métricas de host, métricas no convidado, insights de aplicativos ou por uma programação.
  • Você pode usar Zonas de Disponibilidade (AZ), que são datacenters autônomos independentes dentro de uma região do Azure. Com o suporte AZ, você pode distribuir suas VMs por várias AZs, o que torna seu aplicativo mais confiável e o protege contra falhas no datacenter. Novas instâncias dentro de um conjunto de escala são distribuídas automaticamente uniformemente entre AZs.
  • A adição de um balanceador de carga torna-se mais fácil. Os conjuntos de dimensionamento de máquinas virtuais dão suporte ao uso do Azure Load Balancer para distribuição básica de tráfego da Camada 4. Eles também oferecem suporte ao Gateway de Aplicativo do Azure para distribuição de tráfego L7 mais avançada e terminação SSL.

Existem alguns fatores importantes que precisa de considerar antes de implementar conjuntos de dimensionamento. Especificamente:

  • Evite a aderência da instância, para que nenhum cliente fique preso a um back-end específico.
  • Remova dados persistentes da VM e armazene-os em outro lugar, como no Armazenamento do Azure ou em um banco de dados.
  • Crie tendo em conta a redução horizontal. Também é importante que seu aplicativo possa ser facilmente reduzido. Ele tem que lidar graciosamente não apenas com mais instâncias adicionadas ao pool de servidores que lidam com o tráfego, mas também com o encerramento abrupto de instâncias à medida que a carga cai. A redução vertical é muitas vezes negligenciada.

Desacoplamento

Adicionou mais VMs com conjuntos de dimensionamento. A expansão é a resposta típica para "precisamos escalar". Mas, você só pode escalar em uma única métrica, e essa resposta pode não ser relevante para todas as tarefas executadas pelo seu serviço de produto.

No nosso cenário, o serviço de produtos tem um trabalho. Ele pega uma imagem do produto e depois que essa imagem é carregada. Ele transcodifica essa imagem e a armazena em vários tamanhos diferentes para miniaturas, imagens no catálogo e assim por diante. O processamento de imagem consome muita CPU, mas a utilização geral consome muita memória.

O processamento de imagem é uma tarefa assíncrona que pode ser dividida num trabalho em segundo plano. Você pode fazer isso desacoplando seu serviço de processamento de imagem usando uma fila. O desacoplamento permite dimensionar ambos os serviços de forma independente – um na memória (o serviço do produto) e o outro (o serviço de processamento de imagem) na CPU ou até mesmo no comprimento da fila, e fazer com que outro conjunto de escalas consuma essas mensagens e processe as imagens.

Dimensionar com filas

O Azure tem dois tipos de ofertas de colocação em fila:

  • Filas do Barramento de Serviço do Azure Uma oferta de fila mais avançada, que faz parte do produto mais amplo do Azure Service Bus, oferecendo padrões de integração pub/sub e mais avançados.
  • Filas de Armazenamento do Azure Uma interface de fila simples baseada em REST criada sobre o Armazenamento do Azure. Oferece mensagens fiáveis e persistentes.

Os seus requisitos neste cenário são simples, pelo que pode utilizar as Filas de Armazenamento do Azure. Sua camada de produto não precisa ser dimensionada porque você desacoplou essa tarefa em segundo plano.

Colocar em cache dentro da memória

Outra forma de melhorar o desempenho da sua aplicação é implementar uma cache dentro da memória.

Agora você sabe que o desempenho não é exatamente igual à escalabilidade, mas melhorando o desempenho do seu aplicativo, você pode reduzir a carga em outros recursos. Esta melhoria significa que pode não ter de dimensionar tão cedo.

A Cache do Azure para Redis é uma oferta de Redis gerida. Redis pode ser usado para muitos padrões e casos de uso. Para o seu serviço de produtos neste cenário, provavelmente iria implementar o padrão cache-aside. Nesse padrão, você carrega itens do banco de dados no cache conforme necessário, tornando seu aplicativo mais eficiente e reduzindo a carga no banco de dados.

O Redis também pode ser usado como uma fila de mensagens para armazenar em cache conteúdo da Web ou para cache de sessão do usuário. Este tipo de cache pode ser mais adequado para outros serviços no sistema, como o serviço de carrinho de compras, onde você pode armazenar dados do carrinho de compras por sessão no Redis em vez de usar um cookie.

Dimensionar a base de dados

Agora que tornou os recursos de computação mais dimensionáveis, veja a sua base de dados. Neste cenário, está a utilizar a base de dados SQL do Azure, que é uma oferta gerida do SQL Server a partir do Azure.

Os bancos de dados relacionais são mais difíceis de expandir do que os bancos de dados não relacionais. A primeira coisa que você pode fazer para dimensionar seu banco de dados é aumentar o tamanho do banco de dados. Esse redimensionamento pode ser feito facilmente com um tempo médio de inatividade de menos de quatro segundos. Usando uma chamada de API simples no SQL do Azure ou usando um controle deslizante no portal.

Se este dimensionamento não satisfizer os seus requisitos, dependendo das caraterísticas de tráfego, poderá ser adequado aumentar horizontalmente as leituras para a base de dados. Permitindo que você roteie o tráfego de leitura para sua réplica de leitura.

Nota

Com o Azure SQL, se estiver a utilizar os escalões Premium ou Crítico para a Empresa, o Escalamento Horizontal de Leituras está ativado por predefinição. Não pode ser ativado em escalões básicos ou padrão.

Esta alteração tem de ser implementada no código. Veja como fazer isso.

#Azure SQL Connection String

#Master Connection String
ApplicationIntent=ReadWrite

#Read Replica Connection String
ApplicationIntent=ReadOnly

#Full Example
Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Atualize o ApplicationIntent atributo na cadeia de conexão do banco de dados para especificar a qual servidor você deseja se conectar. Use ReadOnly se quiser se conectar à réplica ou ReadWrite se quiser se conectar ao mestre.

Como esse comando deve ser implementado no código, ele pode não ser uma solução adequada para sua situação. E se cada serviço de produtos precisar da capacidade de leitura e escrita?

Nesse caso, você pode examinar a expansão do Banco de Dados SQL usando fragmentação.

Fragmentação de bases de dados

Se, depois de aumentar verticalmente ou implementar Réplicas de Leitura, os recursos das suas bases de dados ainda não corresponderem às necessidades do seu sistema, a próxima opção é a fragmentação.

O compartilhamento é uma técnica para distribuir grandes quantidades de dados estruturados de forma idêntica em muitos bancos de dados independentes. A partilha pode ser necessária por muitas razões. Por exemplo:

  • A quantidade total de dados é demasiado grande para se adaptar às limitações de uma base de dados individual.
  • O débito de transação da carga de trabalho global excede as capacidades de uma base de dados individual.
  • Os inquilinos separados têm de residir em bases de dados físicas diferentes por motivos de conformidade (este requisito não é tanto sobre dimensionamento, mas é outra situação em que é utilizada a fragmentação).

Seu aplicativo adiciona os dados relevantes ao fragmento relevante e, assim, torna seu sistema escalável além das restrições do banco de dados individual.

O Azure SQL disponibiliza as ferramentas de Base de Dados Elástica do Azure. Essas ferramentas ajudam você a criar, manter e consultar bancos de dados SQL fragmentados no Azure a partir da lógica do seu aplicativo.

Verifique o seu conhecimento

1.

O que pode utilizar para gerir um grupo de VMs idênticas com balanceamento de carga?

2.

Qual das seguintes ofertas de produtos é uma interface simples de colocação em fila baseada em REST criada com base no Armazenamento do Azure?