$30 off During Our Annual Pro Sale. View Details »

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!

Lucas Santos

July 18, 2019
Tweet

More Decks by Lucas Santos

Other Decks in Programming

Transcript

  1. Controlando o Tempo
    com Typescript e Event Sourcing

    View Slide

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

    View Slide

  3. obarra.co
    trainingcenter.io

    View Slide

  4. meetup.com/nodebr/

    View Slide

  5. abcdevelopers.org
    cupom: LSANTOSABCDEV2019

    View Slide

  6. slsweek.netlify.com

    View Slide

  7. O que é Event Sourcing?

    View Slide

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

    View Slide

  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

    View Slide

  10. O que isso implica?

    View Slide

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

    View Slide

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

    View Slide

  13. Viagem no tempo!

    View Slide

  14. View Slide

  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

    View Slide

  16. Um exemplo prático

    View Slide

  17. Controle de rotas de navios

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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
    }

    View Slide

  22. Estado

    View Slide

  23. Entidade

    View Slide

  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)

    View Slide

  25. Eventos

    View Slide

  26. Anatomia de um evento
    - ID
    - Data de criação
    - ID do usuário que o criou
    - Dados que foram modificados

    View Slide

  27. Reducers

    View Slide

  28. Reducers
    Estado
    inicial

    View Slide

  29. Reducers
    Estado
    inicial
    Novo
    estado
    inicial
    Aplica Evento

    View Slide

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

    View Slide

  31. Reducers
    Estado
    inicial
    Novo
    estado
    inicial
    Estado
    final
    ...
    Aplica Evento Após aplicar todos os eventos

    View Slide

  32. Arquitetura

    View Slide

  33. D.D.D
    Domain Driven Design

    View Slide

  34. View Slide

  35. Por que Typescript?

    View Slide

  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

    View Slide

  37. Um evento

    View Slide

  38. Uma
    entidade

    View Slide

  39. Um
    reducer

    View Slide

  40. View Slide

  41. View Slide

  42. View Slide

  43. Muito complicado...

    View Slide

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

    View Slide

  45. Time to code!

    View Slide

  46. Reducer?

    View Slide

  47. View Slide

  48. E para salvar isso tudo?

    View Slide

  49. View Slide

  50. Eventos
    Estado

    View Slide

  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

    View Slide

  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

    View Slide

  53. /khaosdoctor @_staticvoid
    lsantos.dev @khaosdoctor
    obrigado_

    View Slide