Dev
Architecture
Architecture

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?

  1. Capacidade de responder o mais rápido possível para mudanças de negócios, tornando um sistema competitivo.
  2. 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.
  3. Um sistema deve ser sustentável, fácil de entender, estender e implantar. Isso aumentará dramaticamente produtividade dos programadores.
  4. Um sistema deve ser escalável. Uma capacidade de crescer horizontalmente para lidar com cargas mais altas e grandes quantidades de dados.
  5. 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.
  6. 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