9 de Setembro de 2025
Schema interno de eventos sem acoplamento acidental
Quando evento interno vira dump de entidade, cada consumidor começa a depender de detalhe demais e o backend perde liberdade para evoluir.
Andrews Ribeiro
Founder & Engineer
3 min Intermediario Sistemas
O problema
Evento interno costuma começar assim:
- “vamos publicar porque outros módulos precisam reagir”
Até aí, tudo bem.
O problema aparece quando o evento vira:
- snapshot completo da entidade
- payload enorme com campos que ninguém sabe se são contrato
- reflexo da tabela atual
Nesse ponto, você não tem evento saudável.
Você tem acoplamento distribuído.
Modelo mental
Evento bom normalmente responde:
- o que aconteceu?
- com quem aconteceu?
- o que um consumidor razoável precisa saber para reagir?
Ele não precisa carregar tudo o que existe no agregado.
Quanto mais o schema parece um dump, mais fácil fica para cada consumidor puxar uma dependência acidental.
Exemplo simples
Imagine um evento de ativação de assinatura.
Uma versão melhor pode ser algo como:
SubscriptionActivatedsubscriptionIdaccountIdactivatedAt- talvez
planTier
Uma versão pior parece:
- todos os campos da assinatura
- todos os dados de billing
- preferências de UI
- metadata solta
- flags herdadas de outros fluxos
No segundo caso, qualquer ajuste interno começa a ter cara de breaking change informal.
O erro comum
O erro comum é dizer:
“manda tudo porque aí ninguém precisa pedir depois”
Isso resolve o presente e piora o futuro.
Você ganha:
- consumidores lendo campo que nunca deveria ter sido contrato
- dificuldade de remover dado
- mudança simples virando migração ampla
- vazamento de semântica interna entre domínios
Outro erro comum é nomear evento como ação técnica, não como fato.
UserSyncPayloadReady costuma dizer menos do que UserEmailChanged, por exemplo.
O que normalmente ajuda
Schema interno melhor costuma nascer de algumas escolhas:
- nomear evento como fato de domínio ou fato operacional relevante
- publicar só o subconjunto que um consumidor razoável precisaria
- separar metadata técnica do dado semântico
- tratar evolução de schema como contrato, não como detalhe de implementação
Também ajuda perguntar:
- se ninguém conhecesse minha tabela, esse evento ainda faria sentido?
Se a resposta for “não”, provavelmente ele está acoplado demais ao modelo atual.
Como um senior pensa
Quem já sofreu com pub/sub bagunçado costuma perguntar:
- este evento existe para quê?
- estou comunicando fato ou transportando estrutura?
- quais campos são realmente estáveis?
- como isso evolui sem prender todos os consumidores na forma atual?
Essas perguntas evitam que evento interno vire RPC disfarçado ou dump com fan-out.
Ângulo de entrevista
Esse tema aparece em backend, sistemas orientados a eventos, modularização e integração interna.
O entrevistador quer ver se você entende:
- que evento é contrato
- que payload demais aumenta acoplamento invisível
- que schema de evento precisa ser orientado ao fato que aconteceu
Resposta forte costuma soar assim:
“Eu tentaria publicar eventos como fatos claros e com payload mínimo suficiente. Se o evento virar dump de entidade, cada consumidor depende de detalhe acidental e o sistema perde liberdade para evoluir.”
Takeaway direto
Evento interno bom não carrega tudo o que o produtor sabe.
Carrega só o que a conversa realmente precisa dizer.
Resumo rápido
O que vale manter na cabeça
- Evento interno bom comunica fato e intenção, não dump completo de entidade por conveniência.
- Quanto mais campo acidental o evento carrega, mais consumidores passam a depender do que não era contrato.
- Schema de evento precisa evoluir com compatibilidade, observação de uso e semântica clara.
- Pub/sub não reduz acoplamento automaticamente; às vezes ele só o espalha.
Checklist de pratica
Use isto ao responder
- Este evento descreve um fato útil ou só replica o modelo interno atual?
- Se eu mudar um campo, sei quais consumidores realmente dependem dele?
- Estou publicando dado demais por preguiça de modelar o contrato?
- O nome do evento ajuda o consumidor a entender o que aconteceu sem ler a tabela inteira?
Você concluiu este artigo
Compartilhar esta página
Copie o link manualmente no campo abaixo.