Azure Container Apps e Escabilidade
Published: 2023-10-01 20:19:00

Fala Pessoal, tudo bem?

Recentemente pratiquei um pouco a construção de conteinêres dentro do Azure e com isso fui estruturando para que a aplicação ficasse escalável.

Hoje irei demonstrar um pouco como funciona a escalabilidade dentro do Azure Container Apps, dicas de como vocês podem escalar e um mini caso de uso, utilizando um microsserviço em Asp .Net que irá simular um serviço de compra de produtos e um container que irá ler uma fila de pedidos.

A idéia é que consigamos ter métricas que diga "hora de escalar" e mais além, que o serviço se auto escale com <span class="highlighter highlight-on"><span class="highlighter highlight-on"><span class="highlighter highlight-on">base</span></span></span> em algum requisito ou evento. No cenário abaixo iremos simular um pico de acessos em um serviço de compras.

Iremos utilizar a arquitetura abaixo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j66lcycg1z7wr43pz3lo.png)


A arquitetura será da seguinte forma:

Assim que o cliente comprar um produto, teremos o microsserviço de produtos alimentando a fila(Azure Storage Queue), utilizaremos um componente do Kubernetes(Keda) para escalar nosso container com base na quantidade de eventos, que no nosso caso será um limite de 10 pedidos, ou seja, assim que a fila possuir 11 pedidos, teremos mais uma réplica de container para atender a demanda necessária.

Bom, antes de falarmos da nossa estrutura, vamos aos componentes utilizados:

**Azure Container Apps:**
É um serviço de container disponível no Azure baseado em Kubernetes e que não precisamos nos preocupar muito com a infraestrutura.

_Doc: https://learn.microsoft.com/en-us/azure/container-apps/_


**Keda:**
Componente do Kubernetes baseado em eventos que tem como principal ação escalar de forma automática, o Keda possui diversos escaladores prontos para uso.

_Doc: https://keda.sh/docs/2.12/concepts/#architecture_


**Azure Storage Queue:**
É um serviço de armazenamento em fila do Azure, permitindo adicionarmos mensagens a essas filas por meio de requisição Http.

_Doc: https://learn.microsoft.com/en-us/azure/storage/queues/storage-queues-introduction_

**Azure Container Registry:**
Para armazenarmos e gerenciarmos nossas imagens que utilizaremos no container, utilizamos o ACR, serviço do Azure responsável pela hospedagem dessas imagens.

_Doc:_https://learn.microsoft.com/en-us/azure/container-registry/_

**Serviço de Produtos:**
Microsserviço em Asp .NET que expõe um endpoint POST para realizarmos a compra de Produtos.

_Link do Github: https://github.com/Eubrandao/AzureContainerApps_

**Serviço de Pedidos:**
Container criado no Azure Container Apps com regra de Scale customizada para aceitar eventos do Keda.



**Vamos aos Testes:**

1° Criamos um container que será nosso serviço de Pedidos:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ya2mezunt4n99byqpj41.png)

Criamos uma regra de configuração(Scale Rule Setting) com Min 1 e Max 10 de replicas e definimos uma regra de Scale(Scale Rule) com um Queue length de 10, o que isso significa?

Quando nossa fila no Storage queue atingir 11 Pedidos simultâneos, teremos uma nova replica de container sendo criada para atender esse pico de demanda.

Lembrando que o serviço de Pedidos limpa a fila, então quando a fila zerar, a replica de container será de apenas 1(min que definimos)

Simulei a criação de 33 Pedidos simultâneos e...


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6qact9l0iqbxula8a9uo.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kl20d3fctxprrjqaios.png)

Nosso componente do Keda escalou 3 replicas de container para atender a solicitação dos 33 pedidos que estavam em fila.

E quando a fila zerou, voltamos para o número de 1 réplica:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vd4jg1olhdo6he2w5h7t.png)

E assim que funciona a escalabilidade de container com base em eventos, podemos atender cenários onde nem sempre precisamos ter diversos containeres rodando simultaneamente e quando tiver picos de acesso, teremos essa escabilidade, colaborando muito com o custo de operação.

E se eu quiser algo mais simples?
Vamos supor que não é necessário termos uma fila que armazene nossas informações e sim algo já direto, como número de requisições.

Podemos utilizar uma regra de Scale disponível no próprio azure, sem precisar utilizar o Keda, que é o HTTP scaling:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o6pyyn740z3s1004ga2u.png)

Com o HTTP scaling, definimos um limite de requisições concorrentes, e quando esse limite for atingido, nosso container terá uma replica duplicada, triplicada e assim por diante...


O legal de se trabalhar com container, é que muitas vezes queremos escalar apenas um serviço que muita das vezes possui picos de acesso em determinado período e temos outros serviços que "nunca" terão esse possível pico, sem precisarmos definir regras complexas de escabilidade.

O intuito desse artigo foi desmonstrar um pouco dos testes feitos por mim sobre o uso de container, espero que tenham gostado e se tiverem qualquer dúvida, fiquem à vontade para trazê-las.

Um grande Abraço,


Documentação da Microsoft sobre Scale no Azure Container Apps:
https://learn.microsoft.com/en-us/azure/container-apps/scale-app?pivots=azure-cli