Da teoria à prática do Event Sourcing: implementando um serviço de Remote Config com NestJS
(borntodare.me)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.
- Original: Criando uma plataforma interna escalável com event sourcing | Danggeun SERVER Meetup #2
- Código-fonte de exemplo do serviço de config com event sourcing
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
- Inclui ID único, horário de criação, tipo de evento, informações do usuário e conteúdo (
- 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
Muito bom! ^0^