Software Architecture
O que é arquitetura de software ?
- "Arquitetura de software é a essência do valor um produto de software a longo prazo." - Maurício Witter
- "A Arquitetura do produto de software determina inicialmente o quão escalável o produto será." - Maurício Witter
- “Arquitetura é sobre as coisas importantes. Pensar arquiteturalmente sobre software é decidir o que é importante (ou seja, o que é arquitetural) e então gastar energia para manter esses elementos arquitetônicos em boas condições." - Martin Fowler
Percepções
- A arquitetura de software de um sistema consiste na definição dos componentes de software, suas propriedades externas, e seus relacionamentos com outros softwares. A documentação da arquitetura do software facilita a comunicação entre os stakeholders, registra as decisões iniciais acerca do projeto de alto-nível, e permite o reúso do projeto dos componentes e padrões entre projetos.
- Uma arquitetura ruim é um dos principais contribuintes para o crescimento de cruft (elementos do software que impedem a capacidade dos desenvolvedores de entender o software). O software que tem uma arquitetura bagunçada é muito mais difícil de modificar, levando a recursos que chegam mais lentamente e com mais defeitos.
Objetivos
- O projeto de arquitetura está preocupado com a compreensão de como um sistema deve ser organizado e com a estrutura geral desse sistema.
- No modelo do processo de desenvolvimento de software, o projeto de arquitetura é o primeiro estágio no processo de projeto de software.
- É o elo crítico entre o projeto e a engenharia de requisitos, pois identifica os principais componentes estruturais de um sistema e os relacionamentos entre eles.
Como deve ser uma boa arquitetura?
- Capacidade de responder o mais rápido possível para mudanças de negócios, tornando um sistema competitivo.
- Um sistema deve ser dividido em módulos separados por limites. Qualquer módulo, detalhe, mecanismo de entrega deve ser trocável, sem tempo de inatividade, na melhor das hipóteses.
- Um sistema deve ser sustentável, fácil de entender, estender e implantar. Isso aumentará dramaticamente produtividade dos programadores.
- Um sistema deve ser escalável. Uma capacidade de crescer horizontalmente para lidar com cargas mais altas e grandes quantidades de dados.
- Um sistema de software deve ter uma base sólida que permita adiar algumas decisões sobre detalhes de implementação, mecanismos de entrega, bibliotecas, etc.
- Uma arquitetura deve representar e apoiar os casos de intenção e uso de um sistema.
Arquitetura Vertical e Horizontal
Arquitetura Vertical
Escalabilidade no contexto de arquitetura vertical: se da aumentando o poder computacional do servidor pra ele aguentar mais requisições.
- Problema 1: Se um servidor falhar, o serviço fica indisponível.
- Problema 2: Os servidores de alto desempenho são caros e especializados.
- Problema 3: Não é fácil aumentar a capacidade de um servidor. Um aumento de carga pode tornar o servidor inacessível por um tempo.
Arquitetura Horizontal
Escalabilidade no contexto de arquitetura horizontal: se da criando mais servidores menores e distribuindo os acessos.
- Motivo 1: Resiliência. Se um servidor falhar, os outros continuam funcionando, garantindo que o serviço permaneça ativo.
- Motivo 2: Economia. Horizontalmente se utiliza hardware comum e mais acessível, em vez do hardware caro e especializado necessário para a vertical. É mais fácil contratar servidores básicos e padrões do que supercomputadores. Motivo 3: Flexibilidade. Mais acessos em um dado momento ? Só subir mais servidores. Diminuiu a demanda ? Só desligar esses servidores.
- Motivo 4: Distribuição de carga. A escalabilidade horizontal distribui as solicitações dos usuários e as tarefas de processamento entre vários servidores, melhorando o desempenho e o tempo de resposta.
- Motivo 5: Adaptação às novas tecnologias. Basta criar servidores novos e mais modernos sem precisar alterar tudo.
Visões de arquitetura de software
- Centrada no banco de dados
- Centrada na regra de negócio
Exemplos de arquitetura de software
Exemplos
- Model–view–controller (MVC)
- Event-driven architecture (or implicit invocation)
- Hexagonal architecture
- Clean Architecture
- Domain-driven design (DDD)
- Layered (or multilayered architecture)
- Client-server (2-tier, 3-tier, n-tier, cloud computing exhibit this style)
- Microservices architecture
- Computação distribuída
- Component-based
- Asynchronous messaging
- Peer-to-peer (P2P)
- Arquitetura orientada a serviço
- Arquitetura orientada a busca