Slide 1

Slide 1 text

Controlando o Tempo com Typescript e Event Sourcing

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

obarra.co trainingcenter.io

Slide 4

Slide 4 text

meetup.com/nodebr/

Slide 5

Slide 5 text

abcdevelopers.org cupom: LSANTOSABCDEV2019

Slide 6

Slide 6 text

slsweek.netlify.com

Slide 7

Slide 7 text

O que é Event Sourcing?

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

O que isso implica?

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Viagem no tempo!

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Um exemplo prático

Slide 17

Slide 17 text

Controle de rotas de navios

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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 }

Slide 22

Slide 22 text

Estado

Slide 23

Slide 23 text

Entidade

Slide 24

Slide 24 text

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)

Slide 25

Slide 25 text

Eventos

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Reducers

Slide 28

Slide 28 text

Reducers Estado inicial

Slide 29

Slide 29 text

Reducers Estado inicial Novo estado inicial Aplica Evento

Slide 30

Slide 30 text

Reducers Estado inicial Novo estado inicial ... Aplica Evento

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Arquitetura

Slide 33

Slide 33 text

D.D.D Domain Driven Design

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Por que Typescript?

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

Um evento

Slide 38

Slide 38 text

Uma entidade

Slide 39

Slide 39 text

Um reducer

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

Muito complicado...

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

Time to code!

Slide 46

Slide 46 text

Reducer?

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

E para salvar isso tudo?

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

Eventos Estado

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

/khaosdoctor @_staticvoid lsantos.dev @khaosdoctor obrigado_