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

Event Sourcing - Livestream DevelopersBR

Event Sourcing - Livestream DevelopersBR

Esta palestra é uma redução da palestra de mesmo tema apresentada na live do dia 27/02/2019 no canal DevelopersBR do Youtube.

- Link do canal: https://www.youtube.com/channel/UCGhSrtP0-1qq0XPbnMpi2kQ
- Link da palestra original: https://speakerdeck.com/khaosdoctor/controlando-o-tempo-com-typescript-e-event-sourcing

Lucas Santos

February 14, 2019
Tweet

More Decks by Lucas Santos

Other Decks in Programming

Transcript

  1. Lucas Santos
    /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Solutions Architect

    View Slide

  2. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    obarra.co
    trainingcenter.io
    2018.abcdevelopers.org
    mvpconf.com.br

    View Slide

  3. O que é Event
    Sourcing?

    View Slide

  4. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Capture all changes to
    an application state as a
    sequence of events.

    View Slide

  5. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  6. O que isso implica?

    View Slide

  7. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  8. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  9. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Viagem no tempo!

    View Slide

  10. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  11. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  12. Um exemplo prático

    View Slide

  13. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Controle de rotas de navios

    View Slide

  14. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Controle de rotas de navios
    Navio:
    ID: 1bef45c
    Nome: Black Pearl
    Events: []
    Estado: {
    Loc: null
    }

    View Slide

  15. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  16. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  17. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  18. Estado

    View Slide

  19. Entidade

    View Slide

  20. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  21. Eventos

    View Slide

  22. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Anatomia de um evento
    - ID
    - Data de criação
    - ID do usuário que o criou
    - Dados que foram modificados

    View Slide

  23. Reducers

    View Slide

  24. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Reducers
    Estado
    inicial

    View Slide

  25. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Reducers
    Estado
    inicial
    Novo
    estado
    inicial
    Aplica Evento

    View Slide

  26. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Reducers
    Estado
    inicial
    Novo
    estado
    inicial
    ...
    Aplica Evento

    View Slide

  27. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    Reducers
    Estado
    inicial
    Novo
    estado
    inicial
    Estado
    final
    ...
    Aplica Evento Após aplicar todos os eventos

    View Slide

  28. Arquitetura

    View Slide

  29. D.D.D
    Domain Driven Design

    View Slide

  30. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    View Slide

  31. Por que Typescript?

    View Slide

  32. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  33. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor
    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

  34. /khaosdoctor @_staticvoid
    lsantos.me
    @khaosdoctor

    - 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/nxcd/tardis
    - https://github.com/nxcd/paradox
    - https://github.com/nxcd/doctor
    - https://github.com/nxcd/next
    - https://github.com/nxcd/developer-handbook
    - http://bit.ly/imasters-event-sourcing
    - Repo: https://github.com/khaosdoctor/event-sourcing-demo-app
    - Slides: https://speakerdeck.com/khaosdoctor/event-sourcing-livestream-developersbr

    View Slide