וַיִּכָּתֵב סֵפֶר זִכָּרוֹן לְפָנָיו vayikatev sefer zikaron · e escreveu-se um livro de memória · Malachi 3:16

Blog/Artigos · Engenharia

Arquitetura orientada a eventos: o livro de memória que registra tudo que aconteceu

O evento como fato, o desacoplamento por publicação, CQRS, event sourcing e o custo da consistência eventual.

Por Juliano Vince de Campos · · 9 min de leitura · 5 seções · 5 figuras

סֵפֶר זִכָּרוֹן VAYIKATEV · MALACHI 3:16

Malachi descreve um livro de memória escrito diante do Alto, no qual se registra o que os justos fizeram: um registro permanente dos fatos, na ordem em que aconteceram, que não se apaga. É a imagem exata do que a arquitetura orientada a eventos coloca no centro do sistema. No modelo comum, um serviço manda no outro: faça isto, salve aquilo, e quem manda precisa saber quem obedece. No modelo de eventos, ninguém manda: cada parte anuncia o que aconteceu, o pagamento foi aprovado, a apólice entrou em vigência, e escreve esse fato no livro de memória do sistema. Quem se interessa lê e reage, por conta própria. O fato registrado, e não a ordem dada, passa a ser o que move o sistema.

Do comando ao fato: anunciar em vez de mandar

A arquitetura comum é orientada a comando: o serviço de pedidos chama o serviço de estoque, chama o de pagamento, chama o de notificação. Quem inicia precisa conhecer todos os que participam e orquestrar a sequência, e adicionar um novo interessado, o serviço de fidelidade quer saber dos pedidos, exige mexer no serviço de pedidos para chamá-lo também. O acoplamento cresce a cada participante, e o serviço que inicia vira um maestro que precisa conhecer a orquestra inteira.

A arquitetura orientada a eventos inverte a direção. O serviço de pedidos não chama ninguém; ele apenas publica um fato, pedido foi realizado, e segue sua vida. Estoque, pagamento, notificação e fidelidade assinam esse fato e reagem cada um por conta própria, sem que o serviço de pedidos saiba que eles existem. Adicionar um novo interessado não toca no publicador: o novo serviço só assina o evento que já é publicado. É o desacoplamento levado ao extremo, o publicador ignora quem o escuta, e é isso que dá à arquitetura de eventos sua flexibilidade de crescer sem que cada parte precise conhecer as outras. O livro de memória registra o fato; quem quiser que o leia.

Figura 1Do comando ao evento: quem conhece quem
  1. 01Modelo de comandopedidos chama estoque, pagamento, notificação: conhece todos
  2. 02O acoplamento crescenovo interessado exige mexer em quem inicia
  3. 03Publicar o fatopedidos só anuncia 'pedido realizado' e segue
  4. 04IAAssinantes reagemestoque, pagamento, fidelidade leem e agem sozinhos
  5. 05Crescer sem tocarnovo interessado só assina o evento que já existe

O publicador ignora quem o escuta. Adicionar um interessado não toca em quem publica: é o desacoplamento levado ao extremo, e a flexibilidade de crescer sem cada parte conhecer as outras.

No modelo de comando, quem inicia é um maestro que conhece a orquestra inteira. No de eventos, cada parte publica um fato e quem se interessa reage por conta própria. O fato move o sistema, não a ordem.

CQRS: separar quem escreve de quem lê

Um padrão que costuma andar com eventos é o CQRS, a segregação de responsabilidade entre comando e consulta. A ideia é separar o modelo que escreve, que processa comandos e aplica regras de negócio, do modelo que lê, que serve consultas. Parece estranho ter dois modelos para a mesma entidade, mas resolve uma tensão real: o formato ideal para garantir regras de negócio ao escrever raramente é o formato ideal para consultar rápido, e forçar um só modelo a servir aos dois compromete ambos. Com CQRS, o lado da escrita otimiza para consistência e regra; o lado da leitura otimiza para performance de consulta, muitas vezes com dados já pré-formatados para a tela.

CQRS não é obrigatório para eventos, nem eventos exigem CQRS, mas eles se casam bem. Os eventos publicados pelo lado da escrita alimentam a construção dos modelos de leitura: cada fato registrado atualiza uma visão otimizada para consulta. Isso permite ter várias visões de leitura da mesma verdade, uma para o relatório, uma para a tela, uma para a busca, todas alimentadas pelos mesmos eventos. O custo é que essas visões de leitura ficam eventualmente consistentes: há um pequeno atraso entre o fato ser escrito e a visão de leitura refletir. Para muitos casos isso é aceitável e até imperceptível; para outros, onde a leitura precisa refletir a escrita no mesmo instante, CQRS adiciona complexidade sem ganho, e é um exagero.

Figura 2CQRS: dois caminhos para a mesma verdade
  1. Comando (escrita) regraprocessa a ação, aplica regra de negócio, otimiza consistência
  2. Evento publicado o fatoa escrita anuncia o que mudou, alimentando as leituras
  3. Modelos de leitura consultavisões pré-formatadas, otimizadas para consultar rápido
  4. Consistência eventual o custoum atraso pequeno entre escrever e a leitura refletir
O formato ideal para garantir regra ao escrever raramente é o ideal para consultar rápido. CQRS separa os dois. Casa bem com eventos, mas é exagero onde a leitura precisa refletir a escrita no mesmo instante.

Event sourcing: o log de fatos como fonte da verdade

O event sourcing leva o livro de memória à sua conclusão radical: em vez de guardar o estado atual das coisas, guarda-se a sequência completa de eventos que levou a esse estado. Não se armazena a conta tem saldo de cem; armazena-se depositou cinquenta, depositou setenta, sacou vinte, e o saldo é calculado somando os fatos. O log de eventos, append-only e imutável, vira a fonte única da verdade, e o estado atual é apenas uma projeção derivada dele. É exatamente o sefer zikaron: um registro permanente de tudo que aconteceu, na ordem, que não se apaga nem se sobrescreve.

O ganho é extraordinário para certos domínios. Você tem auditoria perfeita de graça, porque cada mudança é um fato registrado com quando e por quê; pode reconstruir o estado em qualquer ponto do passado, reproduzindo os eventos até ali; pode corrigir um bug e reprocessar o histórico para ver o estado que deveria ter existido; e pode criar novas visões de leitura sobre dados antigos, porque os fatos brutos estão todos lá. Domínios financeiros, contábeis e regulatórios, onde o histórico é sagrado, amam event sourcing. O preço é alto: a complexidade sobe muito, consultar o estado atual exige projeção, mudar o formato dos eventos passados é um problema espinhoso, e a maioria dos sistemas não precisa de tudo isso. Event sourcing é uma ferramenta poderosa e cara, para quando o histórico dos fatos é, ele mesmo, um requisito de negócio.

Figura 3Event sourcing: o estado como projeção dos fatos
  1. 01Registrar o fatonão o saldo, mas 'depositou 50', 'sacou 20', na ordem
  2. 02Log append-onlya sequência imutável de eventos, a fonte única da verdade
  3. 03Projetar o estadoo saldo atual é calculado somando os fatos
  4. 04Reconstruir o passadoreproduz os eventos até qualquer ponto, auditoria perfeita
  5. 05Novas visõescria projeções novas sobre os fatos brutos guardados

O log de fatos é a verdade; o estado é derivado. É o sefer zikaron: registro permanente de tudo que aconteceu, que não se apaga nem se sobrescreve.

Guarda-se a sequência de eventos, não o estado atual. Domínios financeiros e regulatórios amam a auditoria perfeita. O preço é alto: complexidade, projeção para consultar, e a maioria dos sistemas não precisa disso.

O custo: consistência eventual e depuração difícil

A arquitetura de eventos cobra um preço que precisa ser encarado de frente. O maior é a consistência eventual: como os assinantes reagem depois, há sempre uma janela em que uma parte do sistema já sabe do fato e outra ainda não. O pedido foi feito, mas o painel de estoque ainda não atualizou. Para muitos casos isso é aceitável; para outros, onde o usuário espera ver o efeito imediato da sua ação, gera confusão, e é preciso desenhar a experiência para lidar com o atraso, o que nem sempre é trivial. Abraçar eventos é abraçar a consistência eventual, e negar isso produz sistemas que prometem imediatismo e entregam inconsistência.

O segundo custo é a depuração. Num sistema de comando, seguir o que aconteceu é seguir a pilha de chamadas. Num sistema de eventos, o fluxo é indireto: A publicou, B reagiu, B publicou outro, C reagiu, e reconstruir a cadeia de causa exige rastreamento e disciplina. Há ainda a escolha entre coreografia, cada serviço reage por conta própria, mais desacoplado mas mais difícil de seguir, e orquestração, um coordenador conduz o fluxo, mais fácil de entender mas com um ponto central. E há as sagas, para manter consistência de uma transação que atravessa vários serviços sem transação distribuída, compensando passos quando algo falha. Nada disso é impossível; tudo isso é complexidade que só se paga quando o desacoplamento e a flexibilidade que os eventos dão valem mais que a simplicidade do comando direto.

Figura 4Quando eventos valem o custo: desacoplamento contra tolerância ao atraso
Valor do desacoplamento e da flexibilidade de crescer
Orientado a eventosmuito desacoplamento a ganhar e atraso tolerável: os eventos rendem.
Eventos com cuidadodesacoplamento útil, mas leitura precisa ser imediata: desenhe para o atraso.
Comando diretopouco a desacoplar e atraso intolerável: a simplicidade do comando vence.
Complexidade sem ganhopouco desacoplamento e atraso intolerável, mas usou eventos: custo à toa.
Tolerância do negócio à consistência eventual
Abraçar eventos é abraçar a consistência eventual e a depuração indireta. Coreografia desacopla mais mas segue-se pior; orquestração é mais clara com um ponto central. Só se paga onde desacoplamento e flexibilidade valem mais que a simplicidade.

A maturidade dos eventos, e onde eles se conectam

A arquitetura de eventos amadurece do comando acoplado ao registro de fatos consciente. No começo é tudo comando direto, serviços que se conhecem e se chamam. Depois vem a publicação de eventos para desacoplar, o primeiro ganho. No meio vêm CQRS onde os padrões de acesso justificam, e sagas para consistência distribuída. No topo é o event sourcing onde o histórico é requisito, com o log como fonte da verdade, e a operação instrumentada para depurar o fluxo indireto. Cada degrau troca acoplamento por flexibilidade, ao preço de mais complexidade, e a maturidade é aplicar cada peça só onde ela se paga.

Eventos conectam este eixo ao anterior. O evento de domínio do DDD é a semente do evento de arquitetura; a divisão em microsserviços quase sempre se comunica por eventos, porque o comando síncrono entre serviços recria o acoplamento que a divisão queria evitar; e a operação da teia de eventos cai sobre a observabilidade e o rastreamento distribuído do eixo de Cloud e Plataforma. O sefer zikaron é a metáfora exata: o valor de registrar o fato, e não só o estado atual, é ter memória do que aconteceu, poder reconstruir, auditar e reagir. Mas nem todo sistema precisa de um livro de memória completo, e a sabedoria está em saber quando o registro dos fatos é um requisito de negócio e quando o estado atual, simples, basta.

Figura 5Maturidade em arquitetura orientada a eventos
  1. 0Comando acopladoserviços se conhecem e se chamam diretamente
  2. 1Publica eventosanuncia fatos para desacoplar, o primeiro ganho
  3. 2CQRS onde importasepara escrita e leitura onde o acesso justifica
  4. 3Sagasconsistência distribuída sem transação, com compensação
  5. 4Event sourcingo log de fatos como fonte da verdade, onde o histórico é requisito
  6. 5Fluxo observáveloperação instrumentada para depurar o fluxo indireto
Cada degrau troca acoplamento por flexibilidade, ao preço de complexidade. A maturidade é aplicar cada peça, CQRS, saga, event sourcing, só onde ela se paga, não por moda de arquitetura.

Para levar

A arquitetura orientada a eventos põe o sefer zikaron no centro: cada parte anuncia um fato, e quem se interessa reage, em vez de um serviço mandar no outro. O desacoplamento deixa o sistema crescer sem cada parte conhecer as outras; CQRS separa escrita de leitura; e o event sourcing guarda o log de fatos como fonte da verdade, com auditoria perfeita. Mas o preço é real, consistência eventual e depuração indireta, e cada peça só se paga onde o histórico e o desacoplamento valem a complexidade. A IA devolve a visão e a rastreabilidade do fluxo. Saber quando registrar o fato, e quando o estado atual basta, continua sendo julgamento de arquitetura.

Tags

  • #julianovincedecampos
  • #Eventdriven
  • #CQRS
  • #Engenharia
  • #EventSourcing
  • #Arquitetura
  • #SistemasDistribuídos
Retrato de Juliano Vince de Campos

Quem escreve: Juliano Vince de Campos

Gerente de Operações, Tecnologia e Infraestrutura (SRE) numa central de registros. Trabalho com tecnologia desde 2009 e com cibersegurança em tempo integral desde 2015, em infraestrutura crítica, fintech e banking. Escrevo sobre o que eu opero: confiabilidade, segurança, governança e IA que passa por gate antes de chegar em produção.

Leia em seguida

Onde eu estudei, me certifiquei e trabalhei

  • University of Cambridge
  • PUC Minas
  • PUC-RS
  • PUC Goiás
  • Pontificia Universidad Católica del Perú
  • Amazon Web Services
  • Google
  • IBM
  • Oracle
  • COBIT 5 Foundation
  • ITIL v3 Foundation
  • Exemplar Global
  • Red Team Leaders
  • Infosec
  • Salesforce
  • Flowgrammers
  • ISO/IEC 27001
  • NIST Cybersecurity Framework
  • Compass UOL
  • Luby
  • Creditas
  • PicPay
  • PagoNxt, Santander
  • Mercado Pago
  • Itaú Unibanco
  • Foursys
  • Soluti Certificação Digital