Pular para o conteúdo
Vamos conversar

ENGENHARIA / 02 — ARQUITETURA DE SOFTWARE / FABRÍCIO CASTRO

Desenhar o sistema é
justificar decisões.

A arquitetura não começa escolhendo microsserviços, Clean Architecture ou o framework mais recente. Começa reconhecendo riscos, limites do domínio e atributos de qualidade. Uma decisão é útil quando explica o que favorece, o que sacrifica e como saber se deixou de servir.

01 / REQUISITOS ANTES DA ARQUITETURA

O desenho nasce das qualidades que precisam sobreviver.

Imagine uma organização fictícia que solicita aprovações de compras, com regras de alçada e integração a um ERP externo. O botão é um detalhe. A arquitetura precisa preservar autorização, consistência, rastreabilidade e capacidade de recuperação em situações que a tela não revela.

ATRIBUTOS / PERGUNTAS VERIFICÁVEIS

Quais compromissos moldam o sistema?

Integridade: duas aprovações concorrentes não podem produzir decisões incompatíveis. Segurança: uma organização não acessa dados de outra. Modificabilidade: alterar uma política de alçada não deve exigir mudar a interface, o banco e a integração por acoplamento acidental.

Operação: identificar a causa de uma falha de sincronização e reprocessá-la com controle. Disponibilidade, latência e recuperação exigem metas negociadas; não há números reais neste estudo.

FORÇAS / O QUE NÃO SE SABE

O risco de projetar com premissas invisíveis.

Não conhecemos volume, frequência de mudança, tamanho da equipe, criticidade financeira, prazo de retenção, comportamento do ERP e orçamento operacional. Sem esses dados, qualquer escolha de filas, cluster, cache ou microsserviços seria uma hipótese — não a solução inevitável.

Critério: levantar perguntas e alternativas com as pessoas responsáveis. A arquitetura é uma decisão revisável, não uma promessa de complexidade antecipada.

02 / RESPONSABILIDADES E DIREÇÃO DE DEPENDÊNCIAS

Separar o que muda junto. Proteger o que não pode variar.

Um diagrama de pastas não define arquitetura. A fronteira relevante descreve quem toma uma decisão, quais invariantes controla e quais dependências podem ser substituídas sem alterar a regra de negócio.

DDD / CONTEXTO

Compras, identidade e integração não são a mesma responsabilidade.

O contexto Compras é dono do ciclo da solicitação e da invariante de decisão. Identidade/Autorização informa permissões vigentes; Integração ERP traduz eventos e contratos de um sistema externo. A divisão concreta precisa ser validada no domínio — não determinada pelo número de tabelas.

Não confundir: bounded context é limite de modelo e linguagem; não obriga banco ou deploy independente.

CLEAN / HEXAGONAL

Domínio não deve importar o servidor HTTP ou o ORM.

Um caso de uso pode depender de contratos de repositório e de autorização. Controllers, Prisma, mensageria e adaptadores executam esses contratos na borda. A inversão de dependência é uma propriedade dos imports e responsabilidades efetivos, não da presença de diretórios chamados `domain` ou `application`.

Quando simplificar: nem todo módulo precisa de dez interfaces. Introduza uma abstração quando ela reduz acoplamento significativo, melhora testes ou protege uma variação plausível.

  1. 01
    Definir vocabulário e invariantes

    Solicitação, aprovador, alçada, decisão e versão. Registrar: não pode haver duas decisões finais incompatíveis sobre a mesma versão e ninguém deve aprovar o próprio pedido.

  2. 02
    Projetar um caso de uso explícito

    A operação de aprovação recebe identidade verificada, ID e versão esperada; consulta política vigente, autoriza e persiste a transição de estado numa fronteira transacional definida.

  3. 03
    Escolher contratos de infraestrutura

    Repositório, relógio e publicador de eventos podem ter portas quando a substituição ou o teste precisa delas. A política de domínio não conhece o nome do cliente HTTP nem o formato de tabela.

  4. 04
    Testar o limite, não apenas a classe

    Uma troca de adaptador deve manter regras e respostas do caso de uso. A integração real com PostgreSQL ainda precisa ser testada para provar bloqueios e comportamento concorrente.

03 / ESTILOS E CONSEQUÊNCIAS

Monólito modular ou serviços separados? Depende das forças reais.

A escolha não ocorre entre “antigo” e “moderno”. O que muda é a localização das fronteiras de processo, implantação, dados e falha. Uma opção pode ser mais adequada hoje e menos adequada após uma mudança comprovada de escala, equipe ou operação.

OPÇÃO A / MONÓLITO MODULAR

Uma implantação, módulos com limites explícitos.

Como funciona: módulos de Compras, Autorização e Integração coexistem num processo e podem compartilhar um banco com regras de ownership. As mudanças do estado de aprovação podem ocorrer em transação local; integração externa permanece fora desse limite.

Ganha: menor complexidade de deploy, rastreamento e coordenação de dados. Custa: acoplamento de release, necessidade de disciplina para impedir imports cruzados e eventual necessidade de extração futura.

Preferir quando: equipe enxuta, limites ainda em aprendizado e nenhum requisito concreto de implantação independente justifica a rede adicional.

OPÇÃO B / MICROSSERVIÇOS

Implantações separadas, falhas também separadas.

Como funciona: serviços possuem contratos e ciclo de deploy próprio; uma atualização entre bancos de serviços não se torna atômica por chamar uma API. Mudanças e eventos exigem versionamento, observabilidade distribuída e política de falhas.

Ganha: autonomia e escalabilidade de componentes quando fronteiras e operação estão maduras. Custa: latência de rede, consistência entre serviços, segurança de comunicação, testes de integração e administração de infraestrutura.

Preferir quando: há razões mensuráveis para isolamento de deploy/equipes ou necessidades distintas de escala e resiliência, com capacidade de operação correspondente.

OPÇÃO C / EXTENSÃO DA SOLUÇÃO EXISTENTE

Talvez seja melhor não construir um ERP adicional.

Se o ERP já oferece workflow de aprovação parametrizável, revisar seu comportamento e controles pode eliminar uma aplicação inteira. Uma API fina de integração ou automação também pode resolver o problema. Análise de licenciamento, aderência, limites e ownership define se é viável.

Armadilha: o entusiasmo com arquitetura própria não é justificativa para custo e superfície de ataque adicionais.

COMPARAÇÃO / CRITÉRIOS

Uma matriz qualitativa, sem pontuação inventada.

Integridade local: favorece limites transacionais simples. Autonomia de release: favorece separação quando há equipes e contratos maduros. Falhas externas: existem em todas as opções. Operação: cresce com o número de processos, bancos e fronteiras remotas.

Decisão revisável: documentar atributos de qualidade, volume observado, limites da equipe, orçamento e gatilhos de extração antes de defender um estilo como definitivo.

04 / DECISÕES EXPLÍCITAS

Uma ADR registra por que a escolha foi feita.

Architecture Decision Record é um registro breve de uma decisão arquitetural significativa: problema, forças, alternativas, escolha, consequências e condições de revisão. O exemplo abaixo é proposta fictícia, não uma deliberação de equipe ou um sistema em produção.

ADR-001 / EXEMPLO PROPOSTO

Adotar inicialmente um monólito modular para o fluxo de compras.

Este registro não afirma que o desenho seja universal. É uma hipótese de arquitetura coerente com uma equipe reduzida e um domínio ainda em descoberta, a revisar diante de fatos observáveis.

CONTEXTOAlçada, auditoria e concorrência precisam de fronteiras transacionais; ERP remoto pode falhar.

FORÇASIntegridade, segurança, custo de operação, capacidade da equipe e mudanças frequentes.

ALTERNATIVASConfigurar ERP, monólito modular, microsserviços separados; rejeições condicionais.

DECISÃOPreferir módulos num deploy e persistência local, se a solução existente for insuficiente.

CONSEQUÊNCIASTransação local mais simples; fronteiras de módulos e release conjunto exigem disciplina.

REVISÃOReavaliar com necessidade comprovada de deploy autônomo, restrição de escala ou mudança de equipe.

O que uma ADR não substitui?

Testes, análise de ameaças, contrato de integração, revisão de orçamento e observabilidade. Uma decisão bem escrita pode estar tecnicamente errada se as hipóteses forem falsas; por isso é versionada e discutida.

Como evitar arquitetura teatral?

Registrar o mínimo necessário para que outra pessoa compreenda o motivo da escolha, sua evidência, seu custo e quando reavaliá-la. Não produzir 40 ADRs para decisões triviais de nomenclatura.

05 / COMUNICAÇÃO ARQUITETURAL

Desenhar limites para conversar, não para decorar.

O modelo C4 organiza a visualização por contexto de sistema, containers, componentes e código, conforme a necessidade da audiência. Não exige quatro desenhos por projeto. O esquema autoral abaixo mostra apenas um contexto de interação simplificado; não pretende substituir diagramas de implantação nem de sequência.

Diagrama de contexto didático: pessoa solicitante e gestor acessam o sistema de compras; o sistema utiliza identidade corporativa e envia dados ao ERP externo sob um contrato de integração.
Diagrama de contexto de alto nível — exemplo original fictício. As setas descrevem relações, não garantias de consistência ou chamadas necessariamente síncronas.
CONTEXTO / PARA QUEM

Quem interage e o que está fora?

Mostre pessoas, sistema de compras, serviço de identidade e ERP. Nomeie relações e fronteiras de confiança. É possível compreender o risco de integração sem apresentar controllers, containers Docker ou tabelas.

CONTAINERS / IMPLANTAÇÃO LÓGICA

Onde ficam API, interface e armazenamento?

Somente quando necessário, detalhe aplicação web, API e banco como containers lógicos do modelo C4. Um “container” no C4 não significa obrigatoriamente Docker. Defina responsabilidade, tecnologia quando justificada e modo de comunicação.

COMPONENTES / RESPONSABILIDADES

O que existe dentro da aplicação?

Um desenho posterior pode mostrar `AprovarSolicitacao`, política de alçada, repositório de solicitações e adaptador ERP. Use sequência/estado ou ER quando a questão for fluxo, concorrência ou dados; C4 não substitui essas perspectivas.

QUALIDADE / LEGIBILIDADE

Uma legenda e palavras importam mais que ícones.

Nomeie responsabilidades e relações; descreva alternativas textualmente para quem utiliza leitor de tela. Mantenha diagrama sincronizado com ADRs e contratos. Um desenho desatualizado com muitas caixas pode causar mais risco que uma explicação curta.

06 / PROJETO PARA FALHAS REAIS

Transação local, ERP remoto. O limite importa.

Atualizar o banco e notificar um sistema externo são duas operações com destinos independentes. Se a notificação falhar depois do commit, o pedido pode estar corretamente aprovado no domínio e ainda não sincronizado. A interface, a fila e os alertas precisam refletir estados diferentes.

  1. 01
    Não permitir duas decisões contraditórias

    O backend confere autorização, tenant, alçada, estado e versão esperada dentro do limite transacional correto. Duas requisições concorrentes precisam resultar em no máximo uma decisão final válida para a mesma versão.

  2. 02
    Registrar intenção de integração junto com a aprovação

    Se a política permite conclusão local, uma outbox transacional pode persistir estado e evento na mesma transação. Ela não faz a transação abranger o ERP e não entrega exatamente uma vez por magia.

  3. 03
    Processar com idempotência e tratamento de duplicação

    Uma tentativa pode sofrer timeout depois de o ERP registrar o pedido. Retry cego criaria duplicidade; é necessário contrato de idempotência, correlação e reconciliação conforme capacidade do ERP.

  4. 04
    Observar e recuperar

    Logs com identificador de correlação, estados de pendência, quantidade de tentativas e runbook permitem distinguir erro temporário de divergência definitiva. Não registrar dados sensíveis além do necessário.

  5. 05
    Provar sob falha

    Testes devem cobrir autoaprovação, acesso cross-tenant, dupla decisão, indisponibilidade externa, evento duplicado, rollback e restauração. Um mock não prova isolamento transacional de PostgreSQL.

TESTES / EVIDÊNCIA

O que precisa ser executado?

T-01: aprovar com alçada vigente. T-02: negar autoaprovação e acesso entre organizações. T-03: executar decisões concorrentes em banco real descartável. T-04: simular 503 e confirmação perdida do ERP. T-05: validar replay sem efeito duplicado.

Estado deste estudo: cenários especificados; nenhum teste de banco, integração ou deploy foi executado para esta página.

DEVOPS / OPERAÇÃO

O deploy não é o fim do ciclo.

CI precisa demonstrar integridade dos contratos, migrations e testes. O release requer estratégia de reversão. Em operação, backlog pendente, latência, autorização negada e falha de sincronização devem ser observáveis por sinais vinculados aos requisitos, não por métricas decorativas.

Revisar decisão: crescimento de times e falhas, gargalo comprovado, exigência de autonomia ou mudança de orçamento podem invalidar a ADR inicial.

07 / ROTAS DE APROFUNDAMENTO

Arquitetura é uma disciplina. Não uma página de siglas.

Este hub conecta agora capítulos próprios de DDD e Clean/Hexagonal, além de Requisitos, Design Patterns e DevOps. A expansão posterior contempla monólito modular, microsserviços, CQRS, Event Sourcing, integrações, multitenancy, System Design, C4 e ADRs. Temas futuros só ganharão links quando houver páginas reais, critérios e testes.

CAMINHO / DOMÍNIO E ESTRUTURA

Da regra de negócio ao módulo.

Investigar linguagem ubíqua, bounded contexts, agregados e invariantes. Depois comparar organização modular e inversão de dependências em Clean/Hexagonal, com código e testes mostrando a consequência de cada escolha.

CAMINHO / DISTRIBUIÇÃO E EVENTOS

Quando a rede entra no domínio.

Estudar consistência, filas, event-driven, outbox, Saga, CQRS, event sourcing e contratos. Separar padrões de implementação, estilos arquiteturais e mecanismos operacionais para não criar uma falsa equivalência entre eles.

CAMINHO / PADRÕES E REFACTORING

Design Patterns no ponto em que ajudam.

Investigar Strategy, State, Adapter e Facade no contexto do caso de compras. Mostrar código antes/depois, custo da abstração, alternativa simples, critérios de não uso e testes que protegem a mudança.

CAMINHO / PLATAFORMA E QUALIDADE

Como validar, entregar e operar.

Ligar decisões aos testes de concorrência, requisitos de autorização, CI/CD, observabilidade, SRE e recuperação. Uma arquitetura que ninguém consegue implantar ou depurar continua sendo uma hipótese incompleta.

08 / FONTES E LIMITES

Confrontar minhas escolhas com referências verificáveis.

O conteúdo é um estudo de arquitetura e o fluxo de compras é hipotético. As fontes são suporte conceitual, não autorização para copiar diagramas ou declarar competência profissional comprovada. Exemplos e diagramas desta página foram escritos para este caso.

FONTE PRIMÁRIA / C4

Simon Brown — modelo C4.

Documentação do próprio modelo para níveis de zoom, notação flexível e delimitação do que os diagramas estruturais explicam.

Consultar C4 Model

FONTE / DECISÕES

Microsoft — Architecture Decision Records.

Referência para registrar contexto, opções rejeitadas, decisão, consequências e necessidade de revisão conforme o sistema evolui.

Consultar ADR

FONTE / SISTEMAS DISTRIBUÍDOS

AWS — Transactional Outbox.

Descreve o problema de gravação em dois destinos, duplicatas e consumidores idempotentes. Não elimina necessidade de decisões sobre ordenação e reconciliação.

Consultar Outbox

LEITURA COMPARATIVA / MICROSSERVIÇOS

Martin Fowler — pré-requisitos operacionais.

Uma perspectiva sobre as competências e o custo de operação exigidos por microsserviços. Não é regra absoluta; confrontar os argumentos com requisitos e situações contrárias.

Consultar análise

Continue explorando.Engenharia de software ↗
Vamos conversar?

Explore o portfólio

26 páginas encontradas · Esc para fechar