10 pontos por tothefullest08 2025-04-05 | 1 comentários | Compartilhar no WhatsApp

Introdução

A apresentação do Won Jihyeok sobre event sourcing no meetup de Server da Danggeun me ajudou bastante a entender o tema. Organizei os conceitos básicos de event sourcing e, com base na apresentação, montei um serviço de config simples usando NestJS, TypeScript e MongoDB.

Conceitos básicos de Event Sourcing

  • Diferente da abordagem CRUD tradicional, todas as mudanças de estado são registradas como eventos imutáveis, facilitando auditoria e rollback
  • Como em um livro contábil, todas as transações (eventos) são registradas em sequência, permitindo reconstruir o estado atual a qualquer momento

Componentes principais

  • Evento
    • Inclui ID único, horário de criação, tipo de evento, informações do usuário e conteúdo (body), garantindo imutabilidade e autossuficiência
  • Estado
    • Estado final obtido ao reproduzir todos os eventos (com uso de snapshot ou cache quando necessário)
  • Reducer
    • Função pura que recebe o estado anterior e um evento para calcular o novo estado, mantendo a imutabilidade
  • Entidade
    • Agrupa eventos relacionados e os gerencia como um único objeto, permitindo consultar com eficiência o histórico de mudanças de uma entidade específica

Exemplo de implementação e estrutura

  • Configuração básica do ambiente: execução da aplicação com NestJS
  • Definição de entidades e eventos
    • Uso de interfaces TypeScript e schemas do MongoDB para definir com clareza vários eventos (ex.: criação de configuração, adição/remoção de parâmetros) e objetos de estado
  • Implementação do reducer:
    • Escrita de funções puras que atualizam o estado conforme o tipo de evento, reproduzindo a sequência de eventos para obter o estado final
  • Endpoints de API e camada de serviço
    • Implementação de uma REST API com recursos para criar config, consultar e adicionar/remover parâmetros
    • Uso do padrão dispatch-commit para processar em sequência a publicação do evento, o cálculo do estado e o armazenamento do evento

Evoluções adicionais e integração com sistemas externos

  • Interfaces genéricas
    • Projeto de um repositório de eventos reutilizável para reduzir duplicação de código e garantir segurança de tipos
  • Manipuladores de eventos
    • Integração com sistemas externos, como Slack, para executar processamentos adicionais, como envio de notificações quando eventos ocorrem
  • Estratégias de otimização de desempenho
    • Snapshot: salva o estado em um ponto específico no tempo e aplica apenas os eventos posteriores, reduzindo o custo de reproduzir todo o histórico
    • Cache: uso de cache em memória ou Redis para fornecer rapidamente o estado de entidades consultadas com frequência

Conclusão

  • Event sourcing é uma arquitetura poderosa que registra com clareza todo o histórico de mudanças, aumentando confiabilidade e manutenibilidade
  • É preciso adotá-lo com cuidado, combinando introdução gradual adequada ao domínio com estratégias de otimização como snapshot e cache, além de considerar a curva de aprendizado

1 comentários

 
guseod24 2025-04-06

Muito bom! ^0^