Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Controlando o Tempo com Typescript e Event Sourcing

Controlando o Tempo com Typescript e Event Sourcing

Você já pensou em controlar cada aspecto de sua aplicação? Poder voltar no tempo e desfazer o que foi feito sem nenhum problema? Corrigir erros e bugs em um piscar de olhos? Então provavelmente o Event Sourcing é o que você está procurando, e ele fica ainda melhor quando usamos Typescript!

0a8f40c6cc23fb6c8aad4de732c5abaf?s=128

Lucas Santos

July 18, 2019
Tweet

Transcript

  1. Controlando o Tempo com Typescript e Event Sourcing

  2. senior solutions architect_ quem sou eu_ /khaosdoctor @_staticvoid lsantos.dev @khaosdoctor

    nindoo.ai
  3. obarra.co trainingcenter.io

  4. meetup.com/nodebr/

  5. abcdevelopers.org cupom: LSANTOSABCDEV2019

  6. slsweek.netlify.com

  7. O que é Event Sourcing?

  8. Capture all changes to an application state as a sequence

    of events.
  9. Event Sourcing - Padrão de arquitetura - Apareceu pela primeira

    vez em um artigo de Martin Fowler em 2005 - A entidade tem um estado inicial - O estado inicial só pode ser alterado por eventos - Tudo é uma stream de eventos - Base de padrões como Flux e Redux
  10. O que isso implica?

  11. O que isso implica? - Facilidade de debugging - Log

    automático - Capacidade de desfazer alterações de forma simples - Reconstrução de estados anteriores!
  12. O que isso implica? - Facilidade de debugging - Log

    automático - Capacidade de desfazer alterações de forma simples - Reconstrução de estados anteriores!
  13. Viagem no tempo!

  14. None
  15. Um guia simples - Toda entidade começa com um estado

    inicial - Toda entidade começa com um array de eventos - Um único evento "criado" deve estar presente - O estado final é obtido a partir da redução do array de eventos
  16. Um exemplo prático

  17. Controle de rotas de navios

  18. Controle de rotas de navios Navio: ID: 1bef45c Nome: Black

    Pearl Events: [] Estado: { Loc: null }
  19. Controle de rotas de navios Navio: ID: 1bef45c Nome: Black

    Pearl Events: [ criado ] Estado: { Loc: Santos } Evento: - ID: 1abc34f - Nome: criado - Loc: Santos - Data: 2018-11-05
  20. Controle de rotas de navios Navio: ID: 1bef45c Nome: Black

    Pearl Events: [ criado ] Estado: { Loc: Santos } Evento: - ID: 9d84bc4 - Nome: aportou - Loc: Roterdam - Data: 2018-11-10
  21. Controle de rotas de navios Navio: ID: 1bef45c Nome: Black

    Pearl Events: [ criado ] Estado: { Loc: Santos } Evento: - ID: 9d84bc4 - Nome: aportou - Loc: Roterdam - Data: 2018-11-10 Navio: ID: 1bef45c Nome: Black Pearl Events: [ criado, aportou ] Estado: { Loc: Roterdam }
  22. Estado

  23. Entidade

  24. Anatomia de uma entidade - ID - Propriedades estáticas -

    Array de eventos - Objeto de estado - Data de criação - Data da última modificação - Data da remoção (se aplicável)
  25. Eventos

  26. Anatomia de um evento - ID - Data de criação

    - ID do usuário que o criou - Dados que foram modificados
  27. Reducers

  28. Reducers Estado inicial

  29. Reducers Estado inicial Novo estado inicial Aplica Evento

  30. Reducers Estado inicial Novo estado inicial ... Aplica Evento

  31. Reducers Estado inicial Novo estado inicial Estado final ... Aplica

    Evento Após aplicar todos os eventos
  32. Arquitetura

  33. D.D.D Domain Driven Design

  34. None
  35. Por que Typescript?

  36. Por que Typescript? - Tipos ajudam a saber o retorno

    de cada função - Evita erros em runtime - Entidades têm estados iniciais e finais bem definidos - Eventos têm tipos definidos e precisam seguir uma interface - Tipagem ajuda a manter conceitos de P.O.O - Intellisense no VSCode <3
  37. Um evento

  38. Uma entidade

  39. Um reducer

  40. None
  41. None
  42. None
  43. Muito complicado...

  44. https://github.com/irontitan/tardis https://github.com/irontitan/paradox

  45. Time to code!

  46. Reducer?

  47. None
  48. E para salvar isso tudo?

  49. None
  50. Eventos Estado

  51. Nada é de graça Prós: - É possível saber, exatamente,

    como uma entidade estava em qualquer ponto do tempo - Logs nativos da implementação - D.D.D força atenção ao comportamento ao invés da implementação - Event Streams, por só permitirem inserção, são muito rápidas - Desenvolvimento utilizando DDD se torna muito rápido após o primeiro "set" estar pronto Contras: - Falta de ferramentas com vasto tempo de desenvolvimento - Não existe muita teoria sobre o assunto - Custo de implementação - Custo de inovação, Event Sourcing é ainda muito novo - Pode ser complicado à primeira vista - Limite (ajustável) de 15Mb para documentos no Mongo (1 evento pesa +/- 723B) - Entidades com muitos eventos podem causar dois problemas (contornáveis) - Estouro de tamanho de documento - Demora no reduce
  52. referências_ - https://martinfowler.com/eaaDev/EventSourcing.html - https://medium.com/@gabrielqueiroz/vamos-falar-sobre-event-sourcing-276ae66106f7 - https://microservices.io/patterns/data/event-sourcing.html - https://github.com/irontitan/tardis -

    https://github.com/irontitan/paradox - https://github.com/irontitan/doctor - https://github.com/irontitan/next - http://bit.ly/imasters-event-sourcing - https://imasters.com.br/back-end/event-sourcing-desenvolvendo-sua-primeira-aplicacao - Live sobre este projeto: https://www.youtube.com/watch?v=ShzzilyzohU - Live sobre a arquitetura: https://www.youtube.com/watch?v=VpUt7u-oA5c - Repo: https://github.com/khaosdoctor/event-sourcing-demo-app
  53. /khaosdoctor @_staticvoid lsantos.dev @khaosdoctor obrigado_