Pular para o conteúdo principal
Os produtos Lerian emitem eventos de domínio — fatos de negócio no passado, como a criação de uma conta ou a emissão de uma credencial — em um backbone de streaming compartilhado. Qualquer serviço ou assinante downstream os consome sem se acoplar às APIs internas do produtor. Esta página descreve o contrato de transporte que todo evento da plataforma segue. As páginas por produto listam os eventos concretos que cada sistema emite e consome.

Transporte

Os eventos trafegam como mensagens CloudEvents 1.0 em modo de conteúdo binário sobre Kafka. O modo binário coloca os atributos de contexto do CloudEvents nos cabeçalhos do registro Kafka, cada um com o prefixo ce-, e o corpo do evento no valor do registro como JSON. Um consumidor lê o roteamento e a identidade a partir dos cabeçalhos sem desserializar o payload.

O envelope

Todo registro carrega estes cabeçalhos CloudEvents.
CabeçalhoPresençaContém
ce-specversionSempreVersão da especificação CloudEvents — 1.0.
ce-idSempreId único do evento (UUIDv7). Deduplique por este valor.
ce-sourceSempreO serviço produtor.
ce-typeSempreTipo do evento — studio.lerian.<resource>.<event>.
ce-timeSempreCarimbo de tempo da emissão (RFC 3339).
ce-resourcetypeSempreO recurso — por exemplo account.
ce-eventtypeSempreO evento — por exemplo created.
ce-schemaversionSempreVersão do esquema do payload.
ce-subjectQuando aplicávelO id do agregado a que o evento se refere.
ce-tenantidQuando aplicávelO tenant proprietário; omitido no escopo single-tenant.
ce-datacontenttypeQuando aplicávelTipo de mídia do corpo — application/json.

Tipo do evento

O cabeçalho ce-type nomeia o evento como studio.lerian.<resource>.<event>. A criação de uma conta no ledger é studio.lerian.account.created. Os dois segmentos também aparecem separadamente em ce-resourcetype e ce-eventtype, de modo que um consumidor filtra pelo tipo completo ou por suas partes.

Nomes de tópicos

Cada evento chega a um tópico do Kafka nomeado pelo recurso e pelo evento que transporta, sob um prefixo de plataforma compartilhado:
lerian.streaming.<resource>.<event>
A criação de uma conta no ledger chega em lerian.streaming.account.created; a criação de um titular no CRM em lerian.streaming.holder.created. O prefixo é idêntico em todos os produtores Lerian, então um consumidor se inscreve por recurso e evento sem precisar saber qual serviço emitiu o registro. O nome do tópico não carrega sufixo de versão — a versão do esquema do payload viaja no cabeçalho ce-schemaversion (consulte Versionamento de esquema), então uma mudança de esquema nunca renomeia um tópico.

Fonte

ce-source identifica o serviço produtor e é configurado no deployment pela variável de ambiente STREAMING_CLOUDEVENTS_SOURCE; não é fixado no produto. Registra onde um registro se originou, para auditoria e roteamento do lado do consumidor. O nome do tópico não deriva dela — os tópicos usam o prefixo compartilhado lerian.streaming. independentemente da fonte — então um deployment pode definir qualquer valor de fonte estável e descritivo.
ProdutorFonte padrão
Ledger do Midazlerian.midaz.ledger
CRM do Midazlerian.midaz.crm

Subject e tenant

ce-subject carrega o id do agregado a que o evento se refere — a conta, a transação ou a credencial que o fato descreve. ce-tenantid carrega o tenant proprietário em deployments multi-tenant; é omitido nos eventos de negócio single-tenant, então um consumidor trata a ausência de id de tenant como escopo single-tenant válido, e não como erro.

Versionamento de esquema

Cada evento declara sua própria versão de esquema de payload em ce-schemaversion, independente dos demais eventos da mesma fonte. O padrão é 1.0.0. Um incremento menor é aditivo e retrocompatível; um incremento maior é uma mudança incompatível. A versão fica no cabeçalho, nunca no nome do tópico, então um consumidor que lê os payloads como um leitor tolerante — ignorando campos desconhecidos — não é afetado por uma mudança aditiva.

Garantias de entrega

A entrega é at-least-once. Um consumidor confirma sua posição apenas depois de terminar de processar um registro, então uma queda no meio do processamento reprocessa o registro em vez de descartá-lo — o que significa que o mesmo evento pode chegar mais de uma vez. Deduplique por ce-id e mantenha os handlers idempotentes. No lado do produtor, a durabilidade vem de um outbox transacional. Um produto grava o evento em seu outbox na mesma transação de banco de dados que a mudança de estado que o gerou, de modo que o evento e o fato que ele reporta são confirmados ou revertidos juntos. Em seguida, um relay publica no Kafka as linhas confirmadas do outbox e tenta novamente durante as quedas do broker, então nenhum fato de negócio confirmado se perde antes de chegar ao stream.