Em sistemas distribuídos, o problema quase nunca começa no broker.

Ele começa quando o sistema cresce, os eventos passam a ser consumidos por vários serviços e o payload muda sem que exista uma definição clara do que aquele dado deveria continuar significando.

Um time renomeia um campo. Outro remove um atributo que parecia sobrando. Um terceiro muda o formato de um valor para atender uma necessidade interna.

O deploy passa. O tópico continua fluindo. Mas algum consumidor quebra, outro passa a ignorar parte do evento e outro segue processando dados com interpretação errada.

Coordenar isso entre vários serviços vira um desgaste constante.

No post sobre evento como contrato, a ideia central era separar integração de detalhe interno. Aqui, esse raciocínio fica mais concreto: schema é a parte formal desse contrato.

É nesse ponto que schema deixa de parecer detalhe e passa a ser parte do desenho da integração.


O que é schema em eventos

Schema é a definição formal da estrutura de um evento.

Ele descreve quais campos existem, quais tipos são esperados, o que é obrigatório, o que é opcional e quais regras aquele payload precisa respeitar.

Na prática, schema funciona como o contrato de dados entre quem publica e quem consome.

Sem isso, a estrutura do evento fica implícita. O produtor "acha" que está publicando uma coisa. O consumidor "acha" que está lendo a mesma coisa.

Enquanto ambos fazem a mesma leitura informal do payload, parece funcionar.

No post sobre JSON em eventos, esse risco apareceu justamente pelo lado da flexibilidade: quando tudo é informal, pequenas mudanças parecem inocentes até quebrar alguém em produção.

Quando o sistema evolui, essa informalidade cobra a conta.


O que acontece quando não existe schema

Sem schema, o evento continua existindo, mas o contrato fica invisível.

Isso normalmente traz três problemas de produção:

  • não existe validação real antes do evento circular
  • mudanças de payload acontecem sem controle claro de compatibilidade
  • dependências entre produtores e consumidores ficam espalhadas e difíceis de mapear

O efeito mais perigoso nem sempre é a falha explícita.

Muitas vezes o consumidor não cai. Ele apenas passa a interpretar o dado de forma incompleta, ignora um campo relevante ou grava informação inconsistente.

Esse é o tipo de incidente que custa caro porque aparece depois, longe do deploy que causou a quebra. É a mesma lógica de falha tardia que apareceu no post sobre perda lógica no consumer: o sistema parece de pé, mas o significado do processamento já se perdeu.


Por que schema importa de verdade

Quando o evento tem um schema explícito, o payload deixa de ser um JSON "mais ou menos conhecido" e passa a ser um contrato verificável.

Isso muda bastante a operação do sistema.

Primeiro, existe validação.

O produtor deixa de publicar qualquer estrutura por acidente, e o consumidor deixa de depender apenas de suposições informais sobre o formato recebido.

Segundo, a evolução fica mais controlada.

Adicionar um campo opcional é diferente de remover um campo usado por vários consumidores. Mudar um tipo não é a mesma coisa que enriquecer o evento de forma compatível. Com schema, essa diferença deixa de ser opinião e passa a fazer parte do contrato.

Terceiro, a integração fica mais segura.

Quando vários consumidores dependem do mesmo evento, o schema ajuda a reduzir quebras silenciosas e dá previsibilidade para mudanças no payload. Isso é especialmente importante quando o evento já deixou de ser consumo isolado e virou peça central de integração, como discutimos no post sobre DTO vs implementação.

Em outras palavras: ele não impede a evolução. Ele cria um jeito mais seguro de evoluir.


Boas práticas para não transformar evento em improviso

Algumas decisões ajudam bastante:

  • definir o schema como parte do design do evento, e não como ajuste posterior
  • tratar eventos como contratos versionados, especialmente quando a evolução puder afetar consumidores existentes
  • evitar mudanças destrutivas em payloads já publicados, porque o custo quase sempre aparece fora do serviço produtor

Esse cuidado é importante porque evento em produção não pertence só a quem publica.

Depois que ele vira integração entre serviços, ele passa a ter consumidores, dependências e impacto operacional distribuído. Sem isso, o time cai facilmente no cenário descrito no post sobre JSON flexível: o payload continua circulando, mas ninguém sabe ao certo o que ainda é compatível.


O ponto que vale fixar

Sistemas distribuídos exigem contratos claros.

Schema não é burocracia documental. É segurança para integrar serviços sem transformar cada mudança de payload em aposta.

Se o seu evento precisa evoluir, ótimo. Ele provavelmente vai evoluir mesmo.

Mas evoluir sem contrato formal é o caminho mais curto para quebrar consumidores sem perceber.

Tratar schema como parte da arquitetura é o que prepara o terreno para a próxima conversa importante: como evoluir esse contrato sem paralisar o sistema.