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

Microservices, Event Sourcing e CQRS

Microservices, Event Sourcing e CQRS

Nesta talk, demonstro como os conceitos de Event Sourcing e CQRS podem ser aplicados em uma arquitetura de microsserviços.

4cc85f2ac333140c97720f130d60aec4?s=128

Thiago Zanivan

October 06, 2018
Tweet

Transcript

  1. MICROSERVICES & EVENT SOURCING & CQRS Thiago Zanivan Felisberto

  2. AGENDA • Abordagem tradicional • Microservices • Desafios • Event

    Sourcing • CQRS • Demo
  3. EXEMPLO

  4. ABORDAGEM TRADICIONAL

  5. EXEMPLO Produtos Compras DB JSON / HTTP Recursos

  6. ABORDAGEM TRADICIONAL PROS

  7. ABORDAGEM TRADICIONAL PROS • Simples de desenvolver (e manter)

  8. ABORDAGEM TRADICIONAL PROS • Simples de desenvolver (e manter) •

    Simples de distribuir e/ou publicar
  9. ABORDAGEM TRADICIONAL PROS • Simples de desenvolver (e manter) •

    Simples de distribuir e/ou publicar • Simples de escalar
  10. Simples!

  11. EXEMPLO - MONOLITO Produtos Compras DB JSON / HTTP Recursos

  12. EXEMPLO - MONOLITO Produtos Compras DB JSON / HTTP Recursos

    Clientes Auth
  13. None
  14. EXEMPLO - MONOLITO Produtos Compras DB JSON / HTTP Recursos

    Clientes Auth Recomend. Fornecedores Pagamentos E-mails Relatórios Favoritos Pesquisa (barra)
  15. ABORDAGEM TRADICIONAL CONS

  16. ABORDAGEM TRADICIONAL CONS • Base de código complexa e intimidadora

  17. ABORDAGEM TRADICIONAL CONS • Base de código complexa e intimidadora

    • Builds loooooooooooooooooooooongos
  18. ABORDAGEM TRADICIONAL CONS • Base de código complexa e intimidadora

    • Builds loooooooooooooooooooooongos • Deploys e entrega contínua tornam-se um desafio
  19. ABORDAGEM TRADICIONAL CONS • Base de código complexa e intimidadora

    • Builds loooooooooooooooooooooongos • Deploys e entrega contínua tornam-se um desafio • Dificuldade em escalar
  20. ABORDAGEM TRADICIONAL CONS • Base de código complexa e intimidadora

    • Builds loooooooooooooooooooooongos • Deploys e entrega contínua tornam-se um desafio • Dificuldade em escalar • Amarra a equipe a uma tecnologia específica
  21. Complexidade Acidental

  22. Microservices

  23. MICROSERVICES

  24. MICROSERVICES Características • Separa a aplicação em unidades menores independentes,

    fracamente acopladas • Cada serviço tem seu banco de dados • Utiliza-se um protocolo comum para comunicação (HTTP, por ex.) • Podem ser implementados utilizando diferentes tecnologias
  25. EXEMPLO - MICROSERVICES Produtos Compras Clientes

  26. EXEMPLO - MICROSERVICES Produtos Compras Clientes

  27. EXEMPLO - MICROSERVICES Compras Clientes Produtos POST

  28. EXEMPLO - MICROSERVICES Compras Clientes Produtos POST GET GET

  29. EXEMPLO - MICROSERVICES Compras Clientes Produtos POST GET GET OK

  30. VANTAGENS Unidades simples, independentes e escaláveis Recurso POST GET PUT

    DELETE
  31. DESAFIOS • Resiliência Compras Clientes Produtos POST GET GET

  32. • Resiliência DESAFIOS Compras Clientes Produtos POST GET GET 500?

    :(
  33. DESAFIOS • Resiliência • Tempo de resposta Compras Clientes Produtos

    100ms 60ms 80ms 100ms
  34. DESAFIOS • Resiliência • Tempo de resposta Compras Clientes Produtos

    100ms 60ms 80ms 100ms = 340ms = +70%
  35. DESAFIOS • Resiliência • Tempo de resposta • Perda de

    informações
  36. Event Sourcing

  37. EVENT SOURCING “Nós podemos descobrir a situação atual de um

    universo consultando o estado de uma aplicação, e isso responde muitas perguntas. Entretanto, há momentos em que nós não queremos só ver onde nós estamos, mas também queremos saber como chegamos lá.” - Martin Fowler
  38. EVENT SOURCING

  39. EVENT SOURCING state = reducer(state = initialState, event)

  40. EVENT SOURCING Compra iniciada Item adicionado Compra finalizada Item adicionado

    Event Store { } Compra 1
  41. EVENT SOURCING Compra iniciada Item adicionado Compra finalizada Item adicionado

    Event Store { “compraId”: “1”, “clienteId”: “thiago” } { “id”: “1”, “status”: “ABERTA”, “clienteId”: “thiago” “itens”: [] } Compra 1
  42. EVENT SOURCING Compra iniciada Item adicionado Compra finalizada Item adicionado

    Event Store { “compraId”: “1”, “produtoId”: “suco”, “quantidade”: 1, “preco”: 2.80 } { “id”: “1”, “status”: “ABERTA”, “clienteId”: “thiago” “itens”: [ { “produtoId”: “suco”, “quantidade”: 1, “preco”: 2.80 } ] } Compra 1
  43. EVENT SOURCING Compra iniciada Item adicionado Compra finalizada Item adicionado

    Event Store { “compraId”: “1”, “produtoId”: “misto”, “quantidade”: 1, “preco”: 3.00 } { “id”: “1”, “status”: “ABERTA”, “clienteId”: “thiago” “itens”: [ { “produtoId”: “suco”, “quantidade”: 1, “preco”: 2.80 }, { “produtoId”: “misto”, “quantidade”: 1, “preco”: 3.00 } ] } Compra 1
  44. EVENT SOURCING Compra iniciada Item adicionado Compra finalizada Item adicionado

    Event Store { “compraId”: “1” } { “id”: “1”, “status”: “FINALIZADA”, “clienteId”: “thiago” “itens”: [ { “produtoId”: “suco”, “quantidade”: 1, “preco”: 2.80 }, { “produtoId”: “misto”, “quantidade”: 1, “preco”: 3.00 } ] } Compra 1
  45. EVENTS Características de eventos: • Representam um fato que ocorreu

    no passado • Imutáveis • Normalmente possuem um tipo e o ID do agregado
  46. EVENT STORE Características da event store: • Permite apenas operações

    de inserção • Mantém a sequência dos eventos • Persistente
  47. EVENT SOURCING

  48. COMMANDS • Um comando representa a intenção do usuário em

    executar uma determinada operação • Eles são processados por um componente chamado Command Handler, o qual realiza validações e interage com o modelo de negócio
  49. CQRS

  50. CQRS Command Query Responsibility Segregation Significa que você pode utilizar

    modelos de dados distintos para leitura e para escrita!
  51. CQRS Command Comandos Eventos Agregados Modelo de escrita (normalizado) Resource

    para escritas Query Listeners Modelo de leitura (desnormalizado) Resource para leituras
  52. CQRS

  53. EVENT-DRIVEN ARCHITECTURE

  54. Demo

  55. DEMO • Spring Boot • Kafka https://github.com/thiagozf/reactive-microservices