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

Quando Microserviçoes Encontram Event Sourcing

Quando Microserviçoes Encontram Event Sourcing

439e623c5d770ae0da8e61ec08452032?s=128

Vinicius Gomes

April 23, 2018
Tweet

Transcript

  1. QUANDO MICROSERVIÇOS ENCONTRAM EVENT SOURCING Vinicius Gomes 1

  2. VINICIUS GOMES Desenvolvedor na ThoughtWorks vvgomes.com/blog twitter.com/vvgomes 2

  3. AGENDA A abordagem tradicional Introdução a Event Sourcing CQRS Demo

    Considerações finais 3
  4. A ABORDAGEM TRADICIONAL 4

  5. EXEMPLO Online Restaurant 5

  6. ONLINE RESTAURANT Modelos de dados 6

  7. ONLINE RESTAURANT Serviços 7

  8. Restaurant ONLINE RESTAURANT 8

  9. Restaurant ONLINE RESTAURANT 8 I want to open an order!

  10. Restaurant ONLINE RESTAURANT 8 POST I want to open an

    order!
  11. Restaurant ONLINE RESTAURANT 8 POST GET I want to open

    an order!
  12. Restaurant ONLINE RESTAURANT 8 POST GET I want to open

    an order! 200 ✔
  13. Restaurant ONLINE RESTAURANT 9

  14. Restaurant ONLINE RESTAURANT 9 I want to add an item

    to my order!
  15. Restaurant ONLINE RESTAURANT 9 POST I want to add an

    item to my order!
  16. Restaurant ONLINE RESTAURANT 9 POST GET I want to add

    an item to my order!
  17. Restaurant ONLINE RESTAURANT 9 POST GET I want to add

    an item to my order! 200 ✔
  18. A ABORDAGEM TRADICIONAL 10 GET POST PUT DELETE

  19. A ABORDAGEM TRADICIONAL • Simples de implementar 10 GET POST

    PUT DELETE
  20. A ABORDAGEM TRADICIONAL • Simples de implementar • Agnóstica à

    tecnologia 10 GET POST PUT DELETE
  21. DESAFIOS 11

  22. DESAFIOS Acoplamento 12

  23. DESAFIOS Acoplamento Resiliência 13 Restaurant

  24. DESAFIOS Acoplamento Resiliência 13 Restaurant

  25. DESAFIOS Acoplamento Resiliência 13 Restaurant I want to add an

    item to my order!
  26. DESAFIOS Acoplamento Resiliência 13 Restaurant POST I want to add

    an item to my order!
  27. DESAFIOS Acoplamento Resiliência 13 Restaurant POST GET I want to

    add an item to my order!
  28. DESAFIOS Acoplamento Resiliência 13 Restaurant POST GET I want to

    add an item to my order! 503
  29. DESAFIOS Acoplamento Resiliência Tempo de resposta 14

  30. DESAFIOS Acoplamento Resiliência Tempo de resposta Intenção do usuário 15

    Add item to order
  31. DESAFIOS Acoplamento Resiliência Tempo de resposta Intenção do usuário 15

    POST /orders/8659a0d6/items/ Add item to order
  32. DESAFIOS Acoplamento Resiliência Tempo de resposta Intenção do usuário Estado

    atual mutável 16 { "id": “6a208c41…”, "status": "OPEN", "items": [ { "id": “be596c8e…”, "quantity": 1 }, { "id": “5d09509c…”, "quantity": 2 }, { "id": “cc52d1b6…”, "quantity": 1 } ] }
  33. EVENT SOURCING 17

  34. EVENT SOURCING 18

  35. DOMAIN EVENTS 19 { "payload": { "orderId": “be596c8e…”, "itemId": “5d09509c…”,

    "quantity": 1 }, "payloadType": “com.restaurant.ItemAddedToOrderEvent”, "timestamp": “2017-03-25 08:48:51 -03:00”, "revision": “2”, "aggregateId": “6a208c41…” } Representam o passado Imutáveis Permanentes
  36. EVENT STORE 20

  37. EVENT STORE Incremental Sequencial Longa duração 20

  38. AGGREGATES 21 state = reduce(handle, {}, events) Estado atual

  39. AGGREGATES 21 state = reduce(handle, {}, events) Reducer function Estado

    atual
  40. AGGREGATES Exemplo 22 { }

  41. AGGREGATES Exemplo 22 { } payload: { id: “42” }

  42. AGGREGATES Exemplo 23 { "id": “42”, "status": "OPEN", "items": [

    ] } payload: { id: “42” }
  43. AGGREGATES Exemplo 23 { "id": “42”, "status": "OPEN", "items": [

    ] } payload: { orderId: “42”, itemId: “43”, quantity: 1 }
  44. AGGREGATES Exemplo 24 { "id": “42”, "status": "OPEN", "items": [

    { "id": “43”, “quantity": 1 } ] } payload: { orderId: “42”, itemId: “43”, quantity: 1 }
  45. payload: { orderId: “42”, itemId: “44”, quantity: 2 } AGGREGATES

    Exemplo 24 { "id": “42”, "status": "OPEN", "items": [ { "id": “43”, “quantity": 1 } ] }
  46. payload: { orderId: “42”, itemId: “44”, quantity: 2 } AGGREGATES

    Exemplo 25 { "id": “42”, "status": "OPEN", "items": [ { "id": “43”, “quantity": 1 }, { "id": “44”, “quantity": 2 } ] }
  47. AGGREGATES Exemplo 25 { "id": “42”, "status": "OPEN", "items": [

    { "id": “43”, “quantity": 1 }, { "id": “44”, “quantity": 2 } ] } payload: { orderId: “42”, itemId: “43” }
  48. AGGREGATES Exemplo 26 { "id": “42”, "status": "OPEN", "items": [

    { "id": “44”, “quantity": 2 } ] } payload: { orderId: “42”, itemId: “43” }
  49. AGGREGATES Exemplo 26 { "id": “42”, "status": "OPEN", "items": [

    { "id": “44”, “quantity": 2 } ] } payload: { orderId: “42” }
  50. AGGREGATES Exemplo 27 { "id": “42”, "status": "PLACED", "items": [

    { "id": “44”, “quantity": 2 } ] } payload: { orderId: “42” }
  51. AGGREGATES Exemplo 27 { "id": “42”, "status": "PLACED", "items": [

    { "id": “44”, “quantity": 2 } ] } Order Aggregate
  52. COMMANDS 28 Add item to order

  53. COMMANDS 28 Add item to order { "type": “com.restaurant.AddItemToOrderCommand”, "payload":

    { "orderId": “be596c8e…”, "itemId": “5d09509c…”, "quantity": 1 }, "timestamp": “2017-03-25 08:48:51 -03:00” }
  54. COMMANDS 29 (state, command) -> [event] Recebendo comandos

  55. COMMANDS 30 Como clientes enviam comandos? I want to add

    an item to my order! ?
  56. COMMANDS 31 Revisando REST

  57. COMMANDS 31 Revisando REST Resource Collection host/api/orders

  58. COMMANDS 32 Revisando REST Resource host/api/orders/8659a0d6

  59. COMMANDS 33 Revisando REST Nested Resource host/api/orders/8659a0d6/items/5d1a8457

  60. COMMANDS 34 Revisando REST HTTP Methods GET POST PUT/PATCH DELETE

  61. COMMANDS 35 Revisando REST Hypermedia Formats

  62. COMMANDS 36 Comandos são recursos

  63. COMMANDS Opção #1 Um end-point para todos os comandos 37

  64. COMMANDS Opção #1 Um end-point para todos os comandos 37

    POST /orders/8659a0d6/commands { “type": “AddItemToOrderCommand”, "menuItem": “/menu/items/8d30d99“, “quantity": 2 }
  65. COMMANDS Opção #2 Um end-point único por comando 38

  66. COMMANDS Opção #2 Um end-point único por comando 38 POST

    /orders/8659a0d6/items/commands/add { "menuItem": “/menu/items/8d30d99“, “quantity": 2 }
  67. COMMANDS Descoberta de comandos 39

  68. EVENT SOURCING 40

  69. 41 Queries?

  70. QUERIES Más notícias O Event Store não é bom para

    queries 42
  71. QUERIES Más notícias O Event Store não é bom para

    queries 42 Na maioria dos sistemas •Poucas escritas •Muitas leituras
  72. CQRS 43

  73. CQRS Command Query Responsibility Segregation 44

  74. CQRS Command Query Responsibility Segregation 44 Escrita ✍

  75. CQRS Command Query Responsibility Segregation 44 Escrita ✍ Leitura

  76. Service CQRS 45

  77. Service CQRS 45 Command

  78. Service CQRS 45 Command Publish

  79. Service CQRS 45 Command Publish Listen

  80. Service CQRS 45 Command Query Publish Listen

  81. Service A CQRS 46 Service B

  82. Service A CQRS 46 Service B

  83. Service A CQRS 46 Service B

  84. Service A CQRS 46 Service B

  85. CQRS 47 Command model •Definições de comandos •Definições de eventos

    •Aggregate (1) •Repositório •API de escrita
  86. CQRS 47 Command model •Definições de comandos •Definições de eventos

    •Aggregate (1) •Repositório •API de escrita Query model •Consumidores de evento •Entidades •Repositórios •API de consultas
  87. DEMO 48

  88. DEMO Online Restaurant 49 Service

  89. DEMO Online Restaurant 50

  90. EXAMPLE: ONLINE RESTAURANT 51 Online Restaurant Publishes Listen to

  91. EXAMPLE: ONLINE RESTAURANT 52 Online Restaurant Publishes Listen to Publishes

    Listen to
  92. TECHNOLOGIAS Java Spring Boot Axon Framework Spring Data REST RabbitMQ

    53 https://github.com/vvgomes/event-driven-restaurant
  93. CONSIDERAÇÕES FINAIS 54

  94. MICROSERVIÇOS + EVENT SOURCING 55

  95. MICROSERVIÇOS + EVENT SOURCING Benefícios 55

  96. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas 55

  97. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    55
  98. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade 55
  99. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário 55
  100. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento 55
  101. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência 55
  102. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55
  103. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios
  104. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios •Complexidade
  105. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios •Complexidade •Snapshots
  106. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios •Complexidade •Snapshots •Upcasting
  107. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios •Complexidade •Snapshots •Upcasting •Condições de corrida
  108. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios •Complexidade •Snapshots •Upcasting •Condições de corrida •Contratos
  109. MICROSERVIÇOS + EVENT SOURCING Benefícios •Consultas históricas •Auditoria por definição

    •Imutabilidade •Intenção do usuário •Desacoplamento •Resiliência •Escalabilidade flexível 55 Desafios •Complexidade •Snapshots •Upcasting •Condições de corrida •Contratos •Consistência eventual
  110. QUANDO MICROSERVIÇOS ENCONTRAM EVENT SOURCING Vinicius Gomes 56