Como definir um estilo arquitetural para um projeto com base nos requisitos
Definir uma arquitetura para um projeto, vai muito além de apenas adotar o modelo de arquitetura distribuída mais utilizado no momento. Na verdade, deveríamos nos preocupar no quanto estamos adotando soluções baseadas em microserviços ou baseado em eventos. Quanto mais distribuído e fragmentado, certamente teremos maior resiliência, capacidade de desacoplamento, vamos acelerar a entrega de novas atualizações, conseguiremos melhor proveito do hardware por unidade de negócio. Mas será que todas as soluções deveriam buscar esse "estado da arte"?
Pense no problema e na utilização
Ta certo que precisamos projetar soluções escaláveis, pensando no longo prazo, afinal, queremos crescer todas soluções que criamos. No entanto, algumas soluções, como por exemplo um sistema interno de registro de ponto em uma empresa de venda de bananas de 200 funcionários. É perfeitamente possível prever que esse sistema terá, na média, 200 acessos dia, dependendo das funcionalidades, 2,3 ou 4x o consumo. Ai vem algumas questões pra considerar:
- Faz sentido explorar um estilo arquitetural de microserviços? Isso injetaria complexidade e a unidade de negócio desse sistema é extremamente pequena e não tem conexão com o core da empresa, o que obviamente reduz muito as chances desse serviço ser consumido por algo além da própria aplicação de registro de ponto.
- E utilizar uma arquitetura baseada em eventos? Bom, quero marcar meu ponto e no mesmo momento saber que foi registrado, se algo der errado, pensando no modelo de negócio e tamanho da empresa, um e-mail para o departamento de recursos humanos resolve o problema do ponto. Não precisa de uma capacidade de resiliência e recuperação a falhas (algo que provavelmente um sistema de uma aeronave precisaria ter como requisito principal).
O estilo arquitetural em camadas é principalmente motivado por separação de responsabilidade, ou criação de componentes. Muito usado em monoliticos para minimizar a complexidade. A organização motivou o uso mesmo junto de outros estilos como em microserviços. pic.twitter.com/NZhP5752Bb
— Rodrigo Celebrone (@RCelebrone) December 30, 2022
Um passo evolutivo dos monoliticos é o estilo CBD. Um estilo arquitetural para componentes. A interface é única, o banco de dados também, mas precisamos de uma certa flexibilidade e capacidade de escala. É um caminho natural dos monoliticos para microserviços. pic.twitter.com/0qkB6uG8KQ
— Rodrigo Celebrone (@RCelebrone) December 30, 2022
Semelhante a arquitetura em serviços, porém com menor previsibilidade de consumo e necessidade de gerar deploy por unidade de negócio. O estilo de microserviços injetada complexidades como um api Gateway, saga, circuit breaker, comunicação assíncrona, retry e await... pic.twitter.com/Kf1aSTBxIk
— Rodrigo Celebrone (@RCelebrone) December 30, 2022
Estilo arquitetural baseado em eventos, principalmente motivado pela necessidade de resiliência. Tem muitas semelhanças com o modelo de microserviços mas o requisito principal aqui é que todas as comunicações sejam assincronas e baseadas em eventos para garantir resiliência. pic.twitter.com/8OX0WGJQsR
— Rodrigo Celebrone (@RCelebrone) December 30, 2022
Arquitetura micro kernel. Usado em frameworks, aplicações simples baseadas em plugins que permitem extensão, sistemas operacionais ou IDEs. O forte motivador aqui é o requisito de extensibilidade e o "O" do SOLID é muito bem aplicado nesse estilo arquitetural. pic.twitter.com/ovqY4qsL9M
— Rodrigo Celebrone (@RCelebrone) December 30, 2022