Pular para o conteúdo principal

Conceitointermediário

Diagramas de Sequência

Visão Geral

Diagramas estruturais mostram o que existe. Diagramas de sequência mostram o que acontece, em que ordem.

Essa é a diferença essencial, e ela define o uso: um diagrama de sequência documenta um cenário — um caminho específico através do sistema, do início ao fim.

Ele é o melhor artefato disponível para explicar comportamento distribuído, e o pior para descrever um sistema inteiro.

Problema

O diagrama de contêiner mostra que existem seis peças e vinte setas. Ele não responde:

o que acontece quando um pedido é criado?
em que ordem essas chamadas ocorrem?
o que é síncrono e o que é assíncrono?
onde está a transação?
o que acontece se o pagamento falhar no meio?

Setas num diagrama estrutural são relações possíveis. Um fluxo real percorre um subconjunto delas, numa ordem específica, com semântica que a seta não carrega.

Em sistemas distribuídos, essa lacuna é grande: a ordem, a sincronia e o tratamento de falha parcial são exatamente o que torna o comportamento difícil.

Conceitos Centrais

Um diagrama, um cenário

"criação de pedido com pagamento aprovado" ← um cenário
"criação de pedido" ← ainda vago
"tudo que o sistema de pedidos faz" ← não é cenário

O cenário precisa de um nome que descreva um caminho, incluindo o desfecho quando ele importa.

Cenários de exceção merecem diagramas próprios: "pagamento recusado" e "pagamento aprovado" seguem caminhos diferentes o suficiente para não caberem no mesmo desenho com condicionais.

Participantes são contêineres, não classes

O nível de abstração precisa ser explícito, e o mais útil costuma ser o de contêiner:

Portal → API de Pedidos → Serviço de Pagamento → Fila → Serviço de Estoque

Um diagrama de sequência entre classes existe e serve a outro propósito — discutir código, não arquitetura. Misturar os dois no mesmo desenho produz o mesmo problema de níveis misturados descrito no modelo C4.

Síncrono, assíncrono e resposta

A notação carrega uma distinção que os diagramas estruturais perdem:

seta cheia chamada síncrona — quem chama espera
seta tracejada resposta
seta aberta mensagem assíncrona — quem envia segue

Isso importa porque a diferença define disponibilidade composta e latência acumulada. Ver mensageria.

Um fluxo com cinco chamadas síncronas encadeadas é visualmente óbvio num diagrama de sequência, e invisível num estrutural.

O que fazer com falha

Aqui está o maior valor deste diagrama em sistemas distribuídos: ele torna o caminho infeliz desenhável.

o que acontece se a terceira chamada falhar?
o que já foi efetivado até ali?
quem compensa?
o cliente recebe o quê?

Um diagrama de sequência do caminho de falha frequentemente revela que ninguém sabia a resposta. Ver transações distribuídas e sagas.

Notação em texto

Diagramas de sequência são o caso em que descrever em texto e gerar funciona particularmente bem:

Portal ->> API: cria pedido
API ->> Pagamento: autoriza
Pagamento -->> API: aprovado
API -) Fila: pedido confirmado
API -->> Portal: 201

O texto é legível sozinho, versiona bem, e o layout automático de sequência é bom — ao contrário do de diagramas estruturais. Ver documentação viva.

Eles envelhecem por cenário

A meia-vida de um diagrama de sequência é a do fluxo que ele descreve, e fluxos de negócio mudam devagar comparados a estrutura de código.

Isso os torna surpreendentemente duráveis — desde que descrevam o fluxo em nível de contêiner e não de implementação.

Latência acumulada fica visível

Um efeito colateral útil: com os tempos anotados nas mensagens, o diagrama vira uma estimativa de latência do fluxo.

Portal → API 5 ms
API → Autorização 80 ms síncrono
API → Antifraude 120 ms síncrono
API → Banco 10 ms
————————
215 ms antes da primeira resposta

Isso torna discutível o que antes era abstrato: as duas chamadas síncronas no meio somam 93% do tempo, e a pergunta "alguma delas pode ser assíncrona?" passa a ter um número ao lado. Ver latência.

Modelo Mental

Um caminho, no tempo. Estrutura diz o que existe; sequência diz o que acontece.

Quando Usar

  • Para fluxos que atravessam mais de dois contêineres.
  • Para explicar comportamento assíncrono.
  • Para documentar o caminho de falha e a compensação.
  • Em revisões de desenho, para discutir ordem e sincronia.
  • Ao integrar pessoas em fluxos de negócio complexos.

Quando Não Usar

Para descrever o sistema. Ele descreve um caminho.

Com dezenas de mensagens — acima de doze, a leitura se perde.

Com condicionais aninhadas. Dois cenários, dois diagramas.

Para fluxos triviais de duas chamadas — uma frase resolve.

No nível de classe, quando a conversa é arquitetural.

Alternativas

  • Descrição numerada em texto — para fluxos simples, mais rápida de escrever e ler.
  • Fluxo de dados — quando a pergunta é sobre o dado, não a ordem.
  • Diagrama de estados — quando o objeto tem ciclo de vida, e não um caminho.
  • Rastreamento distribuído — mostra a sequência real, não a pretendida. Ver rastreamento.

A última merece nota: uma amostra de rastreamento é um diagrama de sequência gerado a partir do comportamento real, e frequentemente contradiz o desenhado.

Trade-offs

SequênciaEstrutural
ComportamentoEstrutura
Um cenárioO sistema
Mostra ordem e sincroniaSó relações
Vários diagramasUm
DesenhadoRastreamento real
Mostra a intençãoMostra o que ocorre
Legível e curadoRuidoso
Pode estar erradoNão pode

Modos de Falha

Cenário vago. "Criação de pedido" sem desfecho.

Mensagens demais. Ilegível.

Condicionais aninhadas. Dois cenários espremidos.

Só o caminho feliz. O caminho de falha é o que precisava de desenho.

Nível misturado. Contêineres e classes juntos.

Erros Comuns

Documentar apenas o sucesso. O caminho feliz costuma ser óbvio; o valor do diagrama está em mostrar timeout, compensação e falha parcial.

Não distinguir síncrono de assíncrono. É a informação que muda o entendimento de acoplamento e de propagação de falha, e some quando todas as setas são iguais.

Tentar cobrir o sistema com um diagrama de sequência gigante. Ele serve para um fluxo específico. Ampliado para tudo, deixa de ser legível e de responder qualquer pergunta.

Descer ao nível de método numa discussão de arquitetura. O detalhe de implementação afoga a decisão estrutural que a conversa precisava tomar.

Não comparar com o rastreamento real. O diagrama descreve o fluxo pretendido; o rastro distribuído mostra o que acontece. A divergência entre os dois é o achado mais útil.

Exemplo Real

Uma plataforma de pagamentos tinha um fluxo de checkout que atravessava sete serviços. A documentação existente era um diagrama de contêiner e uma descrição em prosa.

Incidentes recorrentes: pedidos cobrados sem confirmação, e pedidos confirmados sem cobrança. Cerca de 40 casos por mês, tratados manualmente.

A equipe desenhou o fluxo em sequência, primeiro o caminho feliz. Ele estava correto e não revelou nada.

Depois desenharam os caminhos de falha — um diagrama para cada ponto em que uma chamada podia falhar. Foram sete diagramas, e três deles não puderam ser completados, porque ninguém sabia o que acontecia:

falha após autorizar o pagamento, antes de gravar o pedido → ninguém sabia
falha ao publicar na fila, depois de gravar o pedido → ninguém sabia
tempo esgotado na autorização com resposta tardia → ninguém sabia

Os três correspondiam exatamente aos padrões dos incidentes.

O que saiu do exercício:

Compensação explícita para o primeiro caso: autorização revertida quando a gravação falha, com registro. Ver sagas.

Publicação transacional para o segundo — gravação e evento na mesma transação, com publicação posterior a partir da tabela. Ver garantias de entrega.

Idempotência na autorização para o terceiro, com chave por pedido. Ver idempotência.

E uma prática que ficou: todo fluxo crítico novo precisa de um diagrama de sequência do caminho de falha antes de ser implementado. A pergunta "desenhe o que acontece se esta chamada falhar" passou a fazer parte da revisão de desenho.

Os incidentes caíram de ~40 para menos de 3 por mês em quatro meses.

Um detalhe que a equipe registra: o diagrama do caminho feliz, que já existia informalmente na cabeça de todos, não tinha nenhum valor de descoberta. O valor inteiro veio dos diagramas que não conseguiram ser terminados.

Conceitos Relacionados

Exercício Prático

Escolha um fluxo do seu sistema que atravesse três ou mais serviços e desenhe o caminho de falha de cada chamada.

Se algum diagrama não puder ser terminado, você encontrou uma lacuna de desenho, não de documentação.

Perguntas de Entrevista

  • O que um diagrama de sequência mostra que um estrutural não mostra?
  • Por que o caminho de falha vale mais que o caminho feliz?
  • Como o rastreamento distribuído se relaciona com este diagrama?

Para Aprofundar

  • Fowler, Martin. UML Distilled. 3ª ed. Addison-Wesley, 2003.
  • Newman, Sam. Building Microservices. 2ª ed. O'Reilly, 2021.
  • Kleppmann, Martin. Designing Data-Intensive Applications. O'Reilly, 2017.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.