Skip to main content
Toda mutação de domínio publica um evento. Não para te dar um webhook hoje — para impedir que os módulos que vão consumi-los se acoplem uns aos outros diretamente.

O contrato do outbox

Um evento é escrito na mesma transação das linhas que ele descreve. Essa única regra compra a garantia que importa: um evento nunca descreve uma escrita que sofreu rollback, e uma escrita que comitou nunca deixa de produzir seu evento. Publicar depois do commit tornaria os dois possíveis, e os dois são o tipo de bug que aparece como “o contador está errado às vezes”. Depois do commit, a API cutuca a fila para drenar o outbox. A cutucada é best-effort: ela compra latência. Uma varredura periódica é o que de fato garante a drenagem, mesmo quando toda cutucada se perde.

O que é publicado hoje

Todo evento carrega a organização a que pertence; os do plano de clientes carregam também o ambiente.

contact.identified dispara uma vez

Só na transição de verdade. Um segundo magic link é um login, não uma segunda identificação — o SQL que marca o contato como identificado informa se mudou alguma coisa, e o evento só é publicado quando mudou.

Payloads carregam ids

Ids, não valores. Consumidores releem a linha, o que mantém endereços de e-mail e nomes fora de toda fila, log e buffer de retry por onde o envelope passa. Também significa que um consumidor atrasado lê o estado atual em vez de uma cópia velha.

Entrega é ao menos uma vez, e fora de ordem

Duas propriedades que já valem hoje, e que vão continuar valendo quando esses eventos virarem webhooks: a mesma entrega pode chegar duas vezes, e a ordem de chegada não é a ordem dos fatos. Cada envelope carrega uma sequência global atribuída no commit — é ela que ordena, não o relógio da chegada.

Webhooks de saída

Ainda não. O barramento interno é a fundação sobre a qual eles vão ser construídos: quando os webhooks de saída chegarem, eles viram mais um consumidor dos mesmos eventos, em vez de um segundo caminho de publicação costurado por todo handler. Nada da lista acima muda de formato quando isso acontecer — é justamente esse o motivo de ter o barramento primeiro.