Glossário
Definições operacionais — o que o termo significa quando alguém precisa decidir com ele, não a definição de dicionário.
Onde dois termos são confundidos com frequência, a distinção é declarada.
A
Abstração — Representação que expõe o que importa para um propósito e oculta o resto. Boa abstração reduz o que é preciso saber; abstração ruim adiciona uma camada sem remover nenhuma.
Acoplamento (coupling) — Grau em que uma mudança em um módulo obriga a mudança em outro. Não é um defeito a eliminar: é uma quantidade a alocar deliberadamente. Módulos que mudam juntos devem estar acoplados.
Agregado (aggregate) — Em DDD, conjunto de objetos tratado como uma unidade de consistência transacional, acessado apenas pela sua raiz.
Anti-corruption layer — Camada de tradução que impede que o modelo de um sistema externo vaze para dentro do seu.
Atributo de qualidade — Propriedade mensurável de como o sistema se comporta: disponibilidade, desempenho, segurança. Distingue-se de requisito funcional, que descreve o que o sistema faz.
B
Backpressure — Mecanismo pelo qual um consumidor sobrecarregado sinaliza ao produtor que reduza o ritmo. Sem ele, sobrecarga vira perda de mensagem ou esgotamento de memória.
Bounded context — Fronteira dentro da qual um modelo de domínio e sua linguagem têm significado único e consistente. Dois contextos podem usar a mesma palavra com sentidos diferentes, e isso é correto.
Bulkhead (anteparo) — Isolamento de recursos para que a exaustão em uma parte não derrube as demais. O nome vem dos compartimentos estanques de um navio.
C
CAP — Resultado que afirma que, durante uma partição de rede, um sistema distribuído não pode ser simultaneamente consistente e disponível. Diz respeito apenas ao comportamento durante a partição — é frequentemente citado como se fosse uma escolha permanente entre as três letras, o que não é.
Circuit breaker (disjuntor) — Componente que interrompe chamadas a um serviço que está falhando, evitando que o chamador desperdice recursos e propague a falha.
Coesão (cohesion) — Grau em que os elementos de um módulo pertencem juntos. Alta coesão e baixo acoplamento são a mesma decisão vista de dois lados: o que fica junto e o que fica separado.
Consistência eventual — Garantia de que, na ausência de novas escritas, todas as réplicas convergem para o mesmo valor. Não diz quando, e é essa ausência que precisa ser tratada na aplicação.
Consistência forte — Garantia de que toda leitura observa a escrita mais recente. Custa latência mesmo sem partição de rede — ver PACELC.
CQRS — Separação entre o modelo usado para escrever e o usado para ler. Resolve o caso em que os dois têm requisitos incompatíveis, ao custo de sincronização entre eles.
D
DDD — Domain-Driven Design. Abordagem que estrutura o software a partir do domínio de negócio e da linguagem de quem o entende.
Disponibilidade (availability) — Fração do tempo em que o sistema responde corretamente. Expressa como porcentagem sobre uma janela declarada; sem a janela, o número não significa nada.
Dívida técnica — Custo futuro assumido por uma decisão que privilegia velocidade agora. Só é dívida quando a escolha foi consciente e há intenção de pagar; o resto é apenas trabalho mal feito.
E
Event sourcing — Persistir a sequência de eventos que levou ao estado, em vez do estado. O estado vira uma projeção derivável. Poderoso e caro: exige versionamento de eventos e reprocessamento.
F
Fitness function — Verificação automatizada de que uma propriedade arquitetural desejada continua válida. Transforma intenção arquitetural em teste.
G
Gargalo (bottleneck) — Recurso que satura primeiro e limita a capacidade do conjunto. Otimizar qualquer outro ponto não aumenta a capacidade total.
I
Idempotência — Propriedade de uma operação cujo efeito é o mesmo se executada uma ou várias vezes. É o que torna seguro repetir uma chamada cujo resultado você não conhece — e por isso é a base de quase toda recuperação em sistema distribuído.
L
Latência — Tempo entre requisição e resposta. Sempre relatada em percentis, nunca em média: a média esconde exatamente a cauda que os usuários percebem.
M
Microsserviços — Estilo em que a aplicação é um conjunto de serviços implantáveis de forma independente, cada um com seus dados. A independência de implantação é o objetivo; o tamanho pequeno é consequência, não meta.
Modularidade — Grau em que o sistema é composto de partes com fronteiras explícitas que podem ser entendidas e alteradas separadamente.
Monolito modular — Aplicação implantada como uma unidade, com fronteiras internas explícitas e impostas. Frequentemente a resposta correta para o caso em que microsserviços seriam adotados por reputação.
P
PACELC — Extensão de CAP: durante partição (P), escolhe-se entre disponibilidade e consistência; caso contrário (E), escolhe-se entre latência e consistência. Descreve melhor o dilema cotidiano, porque partições são raras e o segundo trade-off vale sempre.
Particionamento — Divisão de dados em subconjuntos disjuntos para distribuir carga ou volume. Ver também sharding.
R
Replicação — Manutenção de cópias do mesmo dado em locais distintos. Aumenta disponibilidade e capacidade de leitura; introduz a questão de qual cópia está certa.
Confiabilidade (reliability) — Probabilidade de o sistema operar corretamente por um período. Distingue-se de disponibilidade: um sistema pode estar disponível e devolver resultados errados.
RPO — Recovery Point Objective. Quantidade máxima de dado que se aceita perder, medida em tempo. Define a estratégia de replicação e backup.
RTO — Recovery Time Objective. Tempo máximo aceitável para restaurar o serviço após uma falha. Define a topologia de redundância.
S
Saga — Sequência de transações locais com compensações, usada quando uma transação distribuída não é viável. Troca atomicidade por disponibilidade, e exige que cada passo tenha compensação definida.
Escalabilidade (scalability) — Capacidade de absorver crescimento adicionando recursos. Distingue-se de desempenho: um sistema pode ser rápido e não escalar.
Sharding — Particionamento horizontal em que cada partição vive numa instância separada. A escolha da chave determina se a carga distribui ou concentra num hotspot.
SLA — Service Level Agreement. Compromisso contratual sobre nível de serviço, com consequência comercial. É decisão de negócio.
SLI — Service Level Indicator. A métrica em si — por exemplo, a fração de requisições respondidas abaixo de 300 ms.
SLO — Service Level Objective. A meta interna sobre um SLI. É decisão de engenharia, e deve ser mais rigorosa que o SLA correspondente.
Strangler fig — Padrão de substituição incremental em que o novo sistema intercepta progressivamente o tráfego do antigo até que este possa ser desligado.
T
Tolerância a falhas — Capacidade de continuar operando corretamente apesar da falha de componentes.
Trade-off — Escolha em que ganhar em uma dimensão implica perder em outra. Um "trade-off" sem perda declarada não é um trade-off, é uma preferência.
Transação — Unidade de trabalho com garantias de atomicidade, consistência, isolamento e durabilidade. O nível de isolamento efetivo raramente é o que o nome sugere; vale conferir na documentação do banco específico.
U
Ubiquitous language — Vocabulário compartilhado entre especialistas de domínio e desenvolvedores, usado sem tradução no código e nas conversas. É o mecanismo que faz o restante de DDD funcionar.
V
Value object — Objeto definido pelos seus atributos e não por identidade. Dois com os mesmos valores são intercambiáveis. Imutável por construção.