Comece sempre com 2 instâncias
Publicado em: segunda-feira, 27 de nov de 2023
Tags:

Subir uma única instância de qualquer componente, seja uma API, um Worker ou um Job, pode parecer suficiente em fases iniciais. No entanto, a verdadeira eficiência e capacidade de resposta de uma aplicação só são testadas quando operam em múltiplas instâncias. Iniciar com duas instâncias desde o começo do projeto não é apenas uma medida de precaução, mas uma estratégia proativa para garantir paz de espírito e salvar noites de sono.

Em arquitetura de software robustez e escalabilidade são pilares importantes no desenvolvimento de soluções eficientes. Neste artigo, exploraremos a importância fundamental de operar com múltiplas instâncias desde o início do projeto, abordando desde as melhores práticas em arquitetura de software e soluções, até considerações práticas em .NET, C#, e mais. Esta abordagem não só facilita a escalabilidade, mas também garante a eficiência e a confiabilidade necessárias para projetos de grande porte e missão crítica.

Portanto, nunca suba 1 única instância de nada (API, Worker, Job).

Sempre de 2 (ou mais se necessário), mesmo em fases iniciais.

A lógica por trás dessa ideia é simples:

Quando você destrava a possibilidade de escala, você garante que:

1️⃣ seu código consegue lidar com mais de uma instância

2️⃣ lidou com os dilemas do paralelismo, escala e concorrência

3️⃣ sua infraestrutura consegue lidar com mais de uma instância

Pode parecer simplista, mas essa simples mudança da forma de escolher a quantidade de instâncias inicialmente permite que você fuja da zona cinzenta que é a incapacidade de escala. De 1 para 2, é um salto enorme, enquanto de 2 para 5, 10, 100 é uma questão muito mais simples.

Mas calma, não estou proponto 100 instâncias de nada, sequer 5, estou propondo apenas 2 instâncias.

Aquilo que demandaria testes, implementação, refatoração, simplesmente não depende de nada, só do entendimento do efeito colateral da escala, seja ele custo, ou tensão/carga/stress.

Entenda

Ao operar mais de uma instância, desbloqueamos o potencial de escala do projeto. Isso significa que asseguramos que o código está preparado para lidar com aumento de carga, com alta disponibilidade, e a infraestrutura está apta para lidar com o acréssimo de instâncias.

Assim, evitamos o ponto crítico de ter que viabilizar a escala de um projeto que não consegue escalar. O que demanda refatorações significativas, implantação de novos componentes e testes extensivos, quase como se fosse um projeto novo.

Paralelismo e Concorrência

Trabalhar com várias instâncias desde o início obriga os desenvolvedores a considerarem os desafios do paralelismo e concorrência desde as fases iniciais. Isso inclui garantir que o código seja thread-safe e que os recursos sejam gerenciados eficientemente, evitando problemas como deadlocks e race conditions.

.NET e o próprio C# oferecem recursos robustos para lidar com programação assíncrona e paralelismo. Além disso, a adoção de práticas de DevOps e o uso de Containers e Kubernetes facilitam o gerenciamento de múltiplas instâncias, proporcionando um ambiente mais controlado e eficiente.

Por outro lado, Mensageria também tem suas questões, em especial no uso de RabbitMQ e nas configurações do seu client que precisam definir um parâmetro de prefetch, ao preço de, se não definido, não ser capaz de distribuir mensagens entre múltiplos consumidores de uma fila, criando um fenômeno que consiste em apenas o primeiro consumidor receber todas as mensagens enquanto os demais não recebem nada.

É uma questão de configuração no client, uma chamada a um método do Channel, mas negligenciada simplesmente porque funciona com uma só instância.

Preparando a Infraestrutura para Escalabilidade

Uma infraestrutura que suporta múltiplas instâncias desde o início é essencial para garantir a escalabilidade. Isso inclui o uso de ferramentas que permitam a distribuição da carga de trabalho. Seja um proxy reverso, um API Gateway, ou mesmo um Ingress Controller para lidar com a distribuição de chamadas entre as instâncias.

Conclusão

Esta abordagem não só facilita a gestão inicial do projeto, mas também assegura sua sustentabilidade e capacidade de adaptação a longo prazo. Projetos que começam com múltiplas instâncias estão mais preparados para lidar com o crescimento e as mudanças no mercado, garantindo uma solução robusta e confiável.

Operar com múltiplas instâncias desde o início simplifica significativamente o trabalho do arquiteto de software. Decisões críticas sobre escalabilidade, refatorações e ajustes na arquitetura são minimizadas, já que o sistema é construído com a flexibilidade necessária desde o começo.

A escalabilidade traz desafios relacionados a custo e tensão/carga/stress, então a ideia não é começar com mais do que se precisa. A ideia é ter capacidade de poder aumentar a quantidade de instâncias, sem parir um elefante durante o processo.

Monitorar e otimizar o uso de recursos torna-se crucial para garantir que a escalabilidade não leve a um aumento desproporcional de custos, já que a escala se traduz em tensão/carga/stress e consequentemente custo, se não for feito com cuidado.

Adotar a estratégia de múltiplas instâncias desde o início de um projeto é uma prática que transcende a mera precaução técnica, transformando-se em uma abordagem estratégica para garantir a escalabilidade, eficiência e confiabilidade de soluções de software. Ao considerar cuidadosamente os aspectos de paralelismo, concorrência e infraestrutura, os arquitetos e desenvolvedores podem construir sistemas mais robustos, prontos para os desafios de projetos de qualquer porte, sendo para missão crítica ou não.

O Cloud Native .NET é meu principal projeto.

Onde empenho energia para ajudar, acompanhar, direcionar Desenvolvedores, Líderes Técnicos e jovens Arquitetos na jornada Cloud Native.

Conduzo entregando a maior e mais completa stack de tecnologias do mercado.

Ao trabalhar com desenvolvedores experientes, eu consigo usar seu aprendizado com .NET, banco de dados, e arquitetura para encurtar a jornada.

Ao restringir à desenvolvedores .NET eu consigo usar do contexto de tecnologias e problemas do seu dia-a-dia, coisas que você conhece hoje, como WCF, WebForms, IIS e MVC, por exemplo, para mostrar a comparação entre o que você conhece e o que está sendo apresentado.

É assim que construímos fundamentos sólidos, digerindo a complexidade com didática, tornando o complexo, simples.

É assim que conseguimos tornar uma jornada densa, em um pacote de ~4 meses.

Eu não acredito que um desenvolvedor possa entender uma tecnologia sem compreender seus fundamentos. Ele no máximo consegue ser produtivo, mas isso não faz desse desenvolvedor um bom tomador de decisões técnicas.

É preciso entender os fundamentos para conseguir tomar boas decisões.

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.


4x Microsoft MVP

Categorias

Assine

Luiz Carlos Faria

Mensagem do Autor

Espero que goste desse post. Não deixe de comentar e falar o que achou.

Se acha que esse post pode ajudar alguém que você conheça, compartilhe!

 

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.