Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Event Sourcing - You are doing it wrong @ Devoxx

761 views

Published on

"Every microservice get's its own database and then use Kafka" is a typical and naive advise, when reading about eventsourcing. If you approach this architectural style this way, you will probably have a really awful time ahead.

Eventsourcing and CQRS are two very useful and popular patterns when dealing with data and microservices. We often find in our customer's projects, that both have a severe impact on your future options and the maintainability of your architecture. Presentations and articles on both topics are often superficial and do not tackle real world problems like security and compliance requirements.

This combination of half-knowledge and technical confusion leads to many projects that either refactor back to a 'non-eventsourced' architecture or reduce eventsourcing to a message queue.

In this talk, I will summarize our experience while applying eventsourcing and CQRS accros multiple large financial and insurance companies over the last 5 years. We will cover the Good, the Not so Good, and the 'oh my god...all abandon ships!' when doing eventsourcing in the real world...and see how we solved these issues.

Published in: Technology
  • Be the first to comment

Event Sourcing - You are doing it wrong @ Devoxx

  1. 1. @koenighotze Eventsourcing You are doing it wrong
  2. 2. @koenighotze Eventsourcing You are doing it wrong because I know best
  3. 3. @koenighotze Eventsourcing - You are maybe doing parts of it wrong because we made some mistakes along the way and so will you, I guess. This is difficult because there are no easy right/ wrong answers; only trade-offs.
  4. 4. @koenighotze Eventsourcing You are probably doing parts of it wrong
  5. 5. @koenighotze#Devoxx #EventSourcingFTW David Schmitz Senacor Technologies @koenighotze #Devoxx #EventSourcingFTW
  6. 6. @koenighotze#Devoxx #EventSourcingFTW Are YOU building microservices? Are YOU doing Domain Driven Design? Are YOU applying eventsourcing? Are YOU using Kafka as an eventstore?
  7. 7. @koenighotze#Devoxx #EventSourcingFTW Typical misconceptions Patterns “we” found useful Traps to avoid Not a Kafka-rant What works for us, might not work for you …and the other way around
  8. 8. @koenighotze#Devoxx #EventSourcingFTW What we’ll cover!
  9. 9. @koenighotze Eventsourcing bootcamp
  10. 10. @koenighotze#Devoxx #EventSourcingFTW Eventsourcing from an architects perspective
  11. 11. @koenighotze#Devoxx #EventSourcingFTW MicroserviceMicroservice Microservice How do microservices communicate?
  12. 12. @koenighotze#Devoxx #EventSourcingFTW MicroserviceMicroservice Microservice SUPER EXPENSIVE DATABASE THAT ONLY SCALES VERTICALLY
  13. 13. @koenighotze#Devoxx #EventSourcingFTW MicroserviceMicroservice Microservice DB DB DB
  14. 14. @koenighotze#Devoxx #EventSourcingFTW Kafka - the Golden Source of Truth Microservice Read modelEvents Microservice Read modelEvents Microservice Read modelEvents THE DATA LAKE!
  15. 15. @koenighotze#Devoxx #EventSourcingFTW Kafka Microservice Read modelEvents Microservice Read modelEvents Microservice Read modelEvents THE DATA LAKE! Never mind the details. That is eventsourcing magic. Just do the Right Thing!
  16. 16. @koenighotze#Devoxx #EventSourcingFTW Just, the magician
  17. 17. @koenighotze#Devoxx #EventSourcingFTW The idea in basic terms
  18. 18. @koenighotze#Devoxx #EventSourcingFTW Domain driven design Event driven architecture Distributed systems
  19. 19. @koenighotze#Devoxx #EventSourcingFTW Start with your domain Find the bounded contexts Find the important concepts Find the dynamics in your Business Language
  20. 20. @koenighotze#Devoxx #EventSourcingFTW Aggregate Event Stream Eventstore Read model Projection Stored as data and event type, typically ordered in creation order Stored in eventstore using unique identifiers Derives current state from stream of events Hydrated events result in builds can be stored as a
  21. 21. @koenighotze#Devoxx #EventSourcingFTW David at 19-11-11T08:11 User Onboarded User-David The current David
  22. 22. @koenighotze#Devoxx #EventSourcingFTW User-9714de5c UserOnboarded email: foo@bar.de address: … UserRegistered userId: 9714de5c… UserRelocated newAddress: … Direction of time
  23. 23. @koenighotze#Devoxx #EventSourcingFTW User-9714de5c UserOnboarded email: foo@bar.de address: … UserRegistered userId: 9714de5c… UserRelocated newAddress: … Stream
  24. 24. @koenighotze#Devoxx #EventSourcingFTW User-9714de5c UserOnboarded email: foo@bar.de address: … UserRegistered userId: 9714de5c… UserRelocated newAddress: … Event
  25. 25. @koenighotze#Devoxx #EventSourcingFTW User-9714de5c UserOnboarded email: foo@bar.de address: … UserRegistered userId: 9714de5c… UserRelocated newAddress: … Event Payload
  26. 26. @koenighotze#Devoxx #EventSourcingFTW
  27. 27. @koenighotze#Devoxx #EventSourcingFTW Current User Projection handle User Created handle User Onboarded handle User Relocated … Projections hydrate the state stored in a stream
  28. 28. @koenighotze#Devoxx #EventSourcingFTW User Aggregate userId: 9714de5c… email: foo@bar.de address: <new address> Represents the user at the time of the last event read Current User Projection handle User Created handle User Onboarded handle User Relocated …
  29. 29. @koenighotze#Devoxx #EventSourcingFTW Eventsourcing helps answering the question of dealing with data in distributed systems in a scalable way It makes the dynamics of your systems explicit as first class concepts
  30. 30. @koenighotze#Devoxx #EventSourcingFTW Decoupling on a business level
  31. 31. @koenighotze Read models …and why you may not need to them (initially)
  32. 32. @koenighotze#Devoxx #EventSourcingFTW Read models are local hydrates of the events stored in specific streams
  33. 33. @koenighotze#Devoxx #EventSourcingFTW readModel = Stream.of(events) .leftFold(handlers)
  34. 34. @koenighotze#Devoxx #EventSourcingFTW How can we handle read models?
  35. 35. @koenighotze#Devoxx #EventSourcingFTW Just use a local database
  36. 36. @koenighotze#Devoxx #EventSourcingFTW User Microservice Read model (SQL) user id last event id user name email street 9741… 3 David foo@bar.de … 4532… 7 Martin null …
  37. 37. @koenighotze#Devoxx #EventSourcingFTW User Microservice Read model (SQL) user id last event id user name email street 9741… 4 David qux@ba.ze … 4532… 7 Martin null …
  38. 38. @koenighotze#Devoxx #EventSourcingFTW User Microservice Read model (SQL) Neo4J
  39. 39. @koenighotze#Devoxx #EventSourcingFTW Challenges?
  40. 40. @koenighotze#Devoxx #EventSourcingFTW Eventual consistency Replays and rebuilds Re-deliveries Operational complexity
  41. 41. @koenighotze#Devoxx #EventSourcingFTW You may not need a read model
  42. 42. @koenighotze#Devoxx #EventSourcingFTW Typical strategies for storing events
  43. 43. @koenighotze#Devoxx #EventSourcingFTW Maybe all events of an aggregate type in a single stream?
  44. 44. @koenighotze#Devoxx #EventSourcingFTW Users User A User B User C User D
  45. 45. @koenighotze#Devoxx #EventSourcingFTW User-A User-C User-D Users User-B Better: One stream per aggregate
  46. 46. @koenighotze#Devoxx #EventSourcingFTW User Microservice GET /users/B User-B
  47. 47. @koenighotze#Devoxx #EventSourcingFTW User Microservice GET /users/B User-B
  48. 48. @koenighotze#Devoxx #EventSourcingFTW User Microservice GET /users/B User-B
  49. 49. @koenighotze#Devoxx #EventSourcingFTW Consistent read No operational overhead Super-simple programming logic
  50. 50. @koenighotze#Devoxx #EventSourcingFTW But, what about speed?
  51. 51. @koenighotze#Devoxx #EventSourcingFTW readEntity 100: 66.047ms
  52. 52. @koenighotze#Devoxx #EventSourcingFTW But, what about queries?
  53. 53. @koenighotze#Devoxx #EventSourcingFTW
  54. 54. @koenighotze#Devoxx #EventSourcingFTW Build specific query projection
  55. 55. @koenighotze#Devoxx #EventSourcingFTW $ct-Users
  56. 56. @koenighotze#Devoxx #EventSourcingFTW User-A User-C User-D Adult-Users-Projection User-B
  57. 57. @koenighotze#Devoxx #EventSourcingFTW User-A User-C User-D Adult-Users-Projection User-B
  58. 58. @koenighotze#Devoxx #EventSourcingFTW event handlers are not CPU or IO intensive Prefer small aggregates Measure and introduce persistent read models only if needed
  59. 59. @koenighotze Transactions, concurrency and your eventstore
  60. 60. @koenighotze#Devoxx #EventSourcingFTW How can we guarantee correctness when writing?
  61. 61. @koenighotze#Devoxx #EventSourcingFTW “Only withdraw money, if the bank account holds enough money!”* *Actually, a real bank would not want such a business rule. They earn money if you overdraw your account. An overdraft fee is one of the most expensive fees banks charge. Just saying…
  62. 62. @koenighotze#Devoxx #EventSourcingFTW The correctness of the business result depends on the order of events
  63. 63. @koenighotze#Devoxx #EventSourcingFTW MoneyWithdrawn amount: 97 EUR MoneyDeposited amount: 100 EUR MoneyDeposited amount: 50 EUR 100 EUR MoneyWithdrawn amount: 10 EUR 90 EUR -7 EUR 140 EUR
  64. 64. @koenighotze#Devoxx #EventSourcingFTW Let’s shuffle
  65. 65. @koenighotze#Devoxx #EventSourcingFTW 140 EUR MoneyWithdrawn amount: 97 EUR MoneyWithdrawn amount: 10 EUR MoneyDeposited amount: 100 EUR MoneyDeposited amount: 50 EUR 100 EUR 90 EUR 43 EUR
  66. 66. @koenighotze#Devoxx #EventSourcingFTW I can use a readmodel for fast validation, can I?
  67. 67. @koenighotze#Devoxx #EventSourcingFTW Maybe not
  68. 68. @koenighotze#Devoxx #EventSourcingFTW Are YOUR systems single-threaded?
  69. 69. @koenighotze#Devoxx #EventSourcingFTW Account Microservice Read model (SQL) MoneyWithdrawn Check if account holds enough money Account Microservice MoneyWithdrawn Check if account holds enough money
  70. 70. @koenighotze#Devoxx #EventSourcingFTW Validation against a read model is prone to inconsistencies
  71. 71. @koenighotze#Devoxx #EventSourcingFTW Just manage transactions with a database
  72. 72. @koenighotze#Devoxx #EventSourcingFTW https://www.confluent.io/blog/messaging-single-source-truth/
  73. 73. @koenighotze#Devoxx #EventSourcingFTW Quick tip for finding friends in ops: Ask them to just install and maintain production grade Kafka and Couchbase installations in the Cloud
  74. 74. @koenighotze#Devoxx #EventSourcingFTW The aggregate is responsible for enforcing business invariants
  75. 75. @koenighotze#Devoxx #EventSourcingFTW MoneyWithdrawn amount: 50 EUR I want in! Not if you mess up my internal business rules! Account-123 Current account balance: 30 EUR
  76. 76. @koenighotze#Devoxx #EventSourcingFTW The aggregate is the “Transaction Boundary”
  77. 77. @koenighotze#Devoxx #EventSourcingFTW https://en.wikipedia.org/wiki/Optimistic_concurrency_control
  78. 78. @koenighotze#Devoxx #EventSourcingFTW https://en.wikipedia.org/wiki/Optimistic_concurrency_control OCC assumes that multiple transactions can frequently complete without interfering with each other.
  79. 79. @koenighotze#Devoxx #EventSourcingFTW https://en.wikipedia.org/wiki/Optimistic_concurrency_control …each transaction verifies that no other transaction has modified the data it has read…
  80. 80. @koenighotze#Devoxx #EventSourcingFTW The happy path
  81. 81. @koenighotze#Devoxx #EventSourcingFTW Account lastEventNumber: 5 Account-123 MoneyDeposited eventNumber: 5 amount: 100 EUR … … … MoneyWithdrawn amount: 10 EUR holderId: … accountNumber: … amount: …
  82. 82. @koenighotze#Devoxx #EventSourcingFTW Account-123 MoneyWithdrawn amount: 10 EUR Account lastEventNumber: 5 holderId: … accountNumber: … amount: … MoneyDeposited eventNumber: 5 amount: 100 EUR … … … Account.lastEventNumber(5) === Stream.lastEventNumber(5)
  83. 83. @koenighotze#Devoxx #EventSourcingFTW Account lastEventNumber: 5 Account-123 MoneyDeposited eventNumber: 5 amount: 100 EUR MoneyWithdrawn amount: 10 EUR holderId: … accountNumber: … amount: … eventNumber: 6 … … …
  84. 84. @koenighotze#Devoxx #EventSourcingFTW The not-so-happy path
  85. 85. @koenighotze#Devoxx #EventSourcingFTW Account lastEventNumber: 4 Account-123 MoneyDeposited eventNumber: 4 amount: 10 EUR … … … holderId: … accountNumber: … amount: …
  86. 86. @koenighotze#Devoxx #EventSourcingFTW Account-123 … … … MoneyDeposited eventNumber: 4 amount: 10 EUR Account lastEventNumber: 4 holderId: … accountNumber: … amount: … Account.lastEventNumber(4) !== Stream.lastEventNumber(5) MoneyWithdrawn amount: 97 EUR MoneyDeposited eventNumber: 5 amount: 100 EUR
  87. 87. @koenighotze#Devoxx #EventSourcingFTW Account Microservice PUT /account/1234 account-1234
  88. 88. @koenighotze#Devoxx #EventSourcingFTW PUT /account/1234 Account Microservice account-1234
  89. 89. @koenighotze#Devoxx #EventSourcingFTW PUT /account/1234 Account Microservice account-1234
  90. 90. @koenighotze#Devoxx #EventSourcingFTW PUT /account/1234 Account Microservice account-1234
  91. 91. @koenighotze#Devoxx #EventSourcingFTW PUT /account/1234 Account Microservice account-1234
  92. 92. @koenighotze#Devoxx #EventSourcingFTW And Kafka?
  93. 93. @koenighotze#DevExperience18 #10TipsMicroservices#Devoxx #EventSourcingFTW
  94. 94. @koenighotze#DevExperience18 #10TipsMicroservices#Devoxx #EventSourcingFTW …
  95. 95. @koenighotze#DevExperience18 #10TipsMicroservices#Devoxx #EventSourcingFTW
  96. 96. @koenighotze#Devoxx #EventSourcingFTW Scalability without locks Consistency Design choice Super-simple programming logic
  97. 97. @koenighotze Versions, up-front-design and breaking things down the road
  98. 98. @koenighotze#Devoxx #EventSourcingFTW How can we deal with versions without going crazy?
  99. 99. @koenighotze#Devoxx #EventSourcingFTW Just use semantic versioning and typed events
  100. 100. @koenighotze#Devoxx #EventSourcingFTW Account-123 MoneyDepositedAccountOpened events-1.0.0.jar Producer Consumer
  101. 101. @koenighotze#Devoxx #EventSourcingFTW …then change some event types
  102. 102. @koenighotze#Devoxx #EventSourcingFTW Account-123 …… events-1.0.0.jar Producer Consumer events-2.0.0.jar MoneyDeposited2
  103. 103. @koenighotze#Devoxx #EventSourcingFTW
  104. 104. @koenighotze#Devoxx #EventSourcingFTW Gosh…just apply “Double Write”
  105. 105. @koenighotze#Devoxx #EventSourcingFTW Account-123 …… MoneyDeposited MoneyDeposited2
  106. 106. @koenighotze#Devoxx #EventSourcingFTW Account-123 …… ConsumerShould I process V1? MoneyDeposited MoneyDeposited2
  107. 107. @koenighotze#Devoxx #EventSourcingFTW Account-123 …… Consumer Or wait for a V2…which might never arrive? MoneyDeposited MoneyDeposited2
  108. 108. @koenighotze#Devoxx #EventSourcingFTW MoneyDeposited_v1 MoneyDeposited_v2 … MoneyDeposited_v100
  109. 109. @koenighotze#Devoxx #EventSourcingFTW MoneyDeposited_v1Handler MoneyDeposited_v2Handler … MoneyDeposited_v100Handler
  110. 110. @koenighotze#Devoxx #EventSourcingFTW Upcaster
  111. 111. @koenighotze#Devoxx #EventSourcingFTW Account-123 A V1.0…… Consumer Upcaster A V1.0 B V2.0 A V2.0 A V2.0 f: v1->v2
  112. 112. @koenighotze#Devoxx #EventSourcingFTW 5 months later…
  113. 113. @koenighotze#Devoxx #EventSourcingFTW Account-123 A V1.0…… Consumer Upcaster B V2.0 f: v1->v2 f: v2->v3 f: v3->v4 … f: v97->v98 f: v98->v99 f: v99->v100
  114. 114. @koenighotze#Devoxx #EventSourcingFTW Good luck maintaining that monster
  115. 115. @koenighotze#Devoxx #EventSourcingFTW The new version must be constructible from the previous version. Otherwise it is a new event
  116. 116. @koenighotze#Devoxx #EventSourcingFTW Prefer simple, text-based, human readable events
  117. 117. @koenighotze#Devoxx #EventSourcingFTW Fancy speak for JSON
  118. 118. @koenighotze#Devoxx #EventSourcingFTW
  119. 119. @koenighotze#Devoxx #EventSourcingFTW And correctness?
  120. 120. @koenighotze#Devoxx #EventSourcingFTW String-ly typed events work really well
  121. 121. @koenighotze#Devoxx #EventSourcingFTW Weak schema to the rescue
  122. 122. @koenighotze#Devoxx #EventSourcingFTW
  123. 123. @koenighotze#Devoxx #EventSourcingFTW
  124. 124. @koenighotze#Devoxx #EventSourcingFTW
  125. 125. @koenighotze#Devoxx #EventSourcingFTW
  126. 126. @koenighotze#Devoxx #EventSourcingFTW
  127. 127. @koenighotze#Devoxx #EventSourcingFTW Schema as a description not as a contract
  128. 128. @koenighotze#Devoxx #EventSourcingFTW how do I handle large streams?
  129. 129. @koenighotze#Devoxx #EventSourcingFTW How can you handle event data over a long period of time?
  130. 130. @koenighotze#Devoxx #EventSourcingFTW You don’t
  131. 131. @koenighotze#Devoxx #EventSourcingFTW Just create a snapshot of the stream
  132. 132. @koenighotze#Devoxx #EventSourcingFTW Year’s end procedure
  133. 133. @koenighotze#Devoxx #EventSourcingFTW Year end – also known as an accounting reference date – is the completion of an accounting period. At this time, businesses need to carry out specific procedures to close their books. https://debitoor.com/dictionary/year-end
  134. 134. @koenighotze#Devoxx #EventSourcingFTW https://debitoor.com/dictionary/year-end Year end – also known as an accounting reference date – is the completion of an accounting period. At this time, businesses need to carry out specific procedures to close their books.
  135. 135. @koenighotze#Devoxx #EventSourcingFTW Copy-Transform
  136. 136. @koenighotze#Devoxx #EventSourcingFTW a.k.a. eventsourcing refactoring powertool
  137. 137. @koenighotze#Devoxx #EventSourcingFTW AccountCreated … MoneyTransferred … . . . 2017
  138. 138. @koenighotze#Devoxx #EventSourcingFTW AccountCreated … MoneyTransferred … . . . Initialized … Deactivated … . . . AccountCreated … MoneyTransferred … 2017 2018
  139. 139. @koenighotze#Devoxx #EventSourcingFTW Transactionledger Microservice Initialized … Deactivated … . . . . . .2017 2018 Hic sunt leones
  140. 140. @koenighotze#Devoxx #EventSourcingFTW Same idea if you need to remodel your domain!
  141. 141. @koenighotze#Devoxx #EventSourcingFTW . . . TransferredAndBooked
  142. 142. @koenighotze#Devoxx #EventSourcingFTW . . . Initialized Transferred Booked TransferredAndBooked Deactivated . . . TransferredAndBooked
  143. 143. @koenighotze#Devoxx #EventSourcingFTW The devil is in the detail
  144. 144. @koenighotze Dealing with errors
  145. 145. @koenighotze#Devoxx #EventSourcingFTW MoneyTransferred eventId: 231233 amount: 97 Euro withdrawnAt: 2018-08-30T08:58:26.624
  146. 146. @koenighotze#Devoxx #EventSourcingFTW Just update the event in the eventstore!
  147. 147. @koenighotze#Devoxx #EventSourcingFTW
  148. 148. @koenighotze#Devoxx #EventSourcingFTW Challenges?
  149. 149. @koenighotze#Devoxx #EventSourcingFTW Account-123 …… Consumer …… …
  150. 150. @koenighotze#Devoxx #EventSourcingFTW Consumer Update …  ¯_(ツ)_/¯ Account-123 …… …… … I already know that event. Why should I re-read?
  151. 151. @koenighotze#Devoxx #EventSourcingFTW Ok. Then just use compensation events
  152. 152. @koenighotze#Devoxx #EventSourcingFTW The cancelled or corrected event
  153. 153. @koenighotze#Devoxx #EventSourcingFTW Partial compensation?
  154. 154. @koenighotze#Devoxx #EventSourcingFTW MoneyTransferAmountCorrected eventId: 9 amount: 97 EUR reasonEventId: 8 MoneyTransferred eventId: 8 amount: 97 Euro …
  155. 155. @koenighotze#Devoxx #EventSourcingFTW Full compensation do as accountants do
  156. 156. @koenighotze#Devoxx #EventSourcingFTW MoneyTransferCancelled eventId: 2 reasonEventId: 1 reason: … MoneyTransferred eventId: 1 amount: 97 Euro … MoneyTransferred eventId: 3 amount: 97 EUR …
  157. 157. @koenighotze#Devoxx #EventSourcingFTW The full compensation makes the reason for compensation explicit
  158. 158. @koenighotze GDPR, compliance and eventsourcing
  159. 159. @koenighotze#Devoxx #EventSourcingFTW GDPR
  160. 160. @koenighotze#Devoxx #EventSourcingFTW
  161. 161. @koenighotze#Devoxx #EventSourcingFTW
  162. 162. @koenighotze#Devoxx #EventSourcingFTW Just encrypt and throw the key away
  163. 163. @koenighotze#Devoxx #EventSourcingFTW Every stream is encrypted using a stream-specific key
  164. 164. @koenighotze#Devoxx #EventSourcingFTW Stream EventEvent Event … PayloadPayload Payload Stream EventEvent Event … PayloadPayload Payload Stream EventEvent Event … PayloadPayload Payload
  165. 165. @koenighotze#Devoxx #EventSourcingFTW “Please delete all my data”
  166. 166. @koenighotze#Devoxx #EventSourcingFTW Deletion is effectively deleting the stream-specific key
  167. 167. @koenighotze#Devoxx #EventSourcingFTW Stream EventEvent Event … PayloadPayload Payload Stream EventEvent Event … PayloadPayload Payload Stream EventEvent Event … PayloadPayload Payload ?
  168. 168. @koenighotze#Devoxx #EventSourcingFTW Challenges?
  169. 169. @koenighotze#Devoxx #EventSourcingFTW Key administration Finding what needs to be deleted Storage implications Coding complexity Dashboards, Monitoring
  170. 170. @koenighotze#Devoxx #EventSourcingFTW Being able to delete is awesome
  171. 171. @koenighotze#Devoxx #EventSourcingFTW User Bankaccount Transaction -ledger
  172. 172. @koenighotze#Devoxx #EventSourcingFTW “Please delete all my data”
  173. 173. @koenighotze#Devoxx #EventSourcingFTW Cascading deletes with tombstones
  174. 174. @koenighotze#Devoxx #EventSourcingFTW User Microservice Bankaccount Microservice Transactionledger Microservice User-456 Deleted Bank- account-123 Deleted
  175. 175. @koenighotze#Devoxx #EventSourcingFTW $et-$deleted
  176. 176. @koenighotze#Devoxx #EventSourcingFTW User-456 … … … Eventstore delete User-456 Deleted emit tombstone event User Microservice deleteStream(‘User-456’)
  177. 177. @koenighotze#Devoxx #EventSourcingFTW Bankaccount-123 AccountOpened owner: user-456 … Bankaccount Microservice User-456 Deleted Eventstore delete Bank- account- 123 Deleted emit tombstone event deleteStream(‘Bankaccount-123’)
  178. 178. @koenighotze#Devoxx #EventSourcingFTW
  179. 179. @koenighotze#Devoxx #EventSourcingFTW What if I delete a confluence account?
  180. 180. @koenighotze#Devoxx #EventSourcingFTW Public/private data
  181. 181. @koenighotze#Devoxx #EventSourcingFTW User—Public-456 Id Blue User-Private-456 Schmitz David D-AW-123
  182. 182. @koenighotze#Devoxx #EventSourcingFTW User—Public-456 Id Blue User-Private-456 Schmitz David D-AW-123 Keep this
  183. 183. @koenighotze#Devoxx #EventSourcingFTW User—Public-456 Id Blue User-Private-456 Schmitz David D-AW-123Delete this
  184. 184. @koenighotze#Devoxx #EventSourcingFTW You may be able to keep references to the public data
  185. 185. @koenighotze#Devoxx #EventSourcingFTW Just anonymise the data
  186. 186. @koenighotze#Devoxx #EventSourcingFTW Recital 26
 EU GDPR (26) The principles of data protection should apply to any information concerning an identified or identifiable natural person. Personal data which have undergone pseudonymisation, which could be attributed to a natural person by the use of additional information should be considered to be information on an identifiable natural person.
  187. 187. @koenighotze#Devoxx #EventSourcingFTW Recital 26
 EU GDPR (26) The principles of data protection should apply to any information concerning an identified or identifiable natural person. Personal data which have undergone pseudonymisation, which could be attributed to a natural person by the use of additional information should be considered to be information on an identifiable natural person.
  188. 188. @koenighotze#Devoxx #EventSourcingFTW Surprise: No easy answers
  189. 189. @koenighotze#Devoxx #EventSourcingFTW Ask your lawyer or CISO
  190. 190. @koenighotze#Devoxx #EventSourcingFTW That’s it?
  191. 191. @koenighotze#Devoxx #EventSourcingFTW ES + DDD = Needs more up-front design You can refactor, you can clean up Not enough in-depth books Avoid frameworks esp. if going polyglot Beware: “just…” or “…made easy”
  192. 192. @koenighotze#Devoxx #EventSourcingFTW Forget this talk…read some papers
  193. 193. @koenighotze#Devoxx #EventSourcingFTW
  194. 194. @koenighotze#Devoxx #EventSourcingFTW Choose the right tool?
  195. 195. @koenighotze#Devoxx #EventSourcingFTW
  196. 196. @koenighotze#Devoxx #EventSourcingFTW Thank you! Questions? Comments? Blame? @Koenighotze AND VOTE (not only at Devoxx)

×