SlideShare a Scribd company logo
1 of 203
Download to read offline
@koenighotze
Event sourcing
You are doing it wrong
@koenighotze
Event sourcing
You are doing it wrong
because I know best
@koenighotze
Event sourcing - 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.
@koenighotze
Event sourcing
You are probably doing it wrong
@koenighotze
David Schmitz
Senacor Technologies
@koenighotze
@koenighotze
…building microservices?
…doing Domain Driven Design?
…applying event sourcing?
…using Kafka as an event store?
Are YOU
@koenighotze
Typical misconceptions
Patterns “we” found useful
Traps to avoid
Not a Kafka-rant
No silver bullets
@koenighotze
What we’ll cover!
@koenighotze
Event sourcing bootcamp
@koenighotze
Event driven business
@koenighotze#DevExperience18 #10TipsMicroservices
Coffee ordered
@koenighotze#DevExperience18 #10TipsMicroservices
Order payed
@koenighotze#DevExperience18 #10TipsMicroservices
Coffee prepared
@koenighotze
Behaviour of a domain made
explicit as a first class concept
@koenighotze
And on a technical level?
@koenighotze
MicroserviceMicroservice Microservice
How to represent data and
how to represent behaviour?
@koenighotze
The Golden Source of Truth
Microservice
Local
DBEvents
Microservice
Local
DBEvents
Microservice
Local
DBEvents
THE DATA LAKE!
@koenighotze
Kafka
Microservice
Read
modelEvents
Microservice
Read
modelEvents
Microservice
Read
modelEvents
THE DATA LAKE!
Never mind the details.
That is event sourcing
magic.
Just do the Right Thing!
@koenighotze
Just use magic
@koenighotze#DevExperience18 #10TipsMicroservices
David at 19-11-11T08:11
User Onboarded
User-David
Get the current David
Event
Stream
Eventstore
Projection
Aggregate
Readmodel
@koenighotze#DevExperience18 #10TipsMicroservices
Read models
Transactions and concurrency
Versions, up-front-design
Dealing with errors
GDPR, compliance and eventsourcing
@koenighotze
Read models
…and why you may not need to them (initially)
@koenighotze
User-9714de5c
UserRegistered
userId: 9714de5c…
UserOnboarded
email: foo@bar.de
address: …
UserRelocated
newAddress: …
@koenighotze
User-9714de5c
UserOnboarded
email: foo@bar.de
address: …
UserRegistered
userId: 9714de5c…
UserRelocated
newAddress: …
User Aggregate at 20:13 11.03.2008
userId: 9714de5c…
email: foo@bar.de
address: <new address>
@koenighotze
How can we store read models?
@koenighotze
Just use a local
database
@koenighotze
User
Microservice
Read
model
(SQL)
user id
last event
id
user name email street
9741… 3 David foo@bar.de …
4532… 7 Martin null …
@koenighotze
User
Microservice
Read
model
(SQL)
user id
last event
id
user name email street
9741… 3 David foo@bar.de …
4532… 7 Martin null …
@koenighotze
User
Microservice
Read
model
(SQL)
user id
last event
id
user name email street
9741… 4 David qux@ba.ze …
4532… 7 Martin null …
@koenighotze
User
Microservice
Read
model
(SQL)
Neo4J
@koenighotze
Challenges?
@koenighotze
Eventual consistency
Zero downtime replays and rebuilds
Re-deliveries and effectively once
Operational complexity
@koenighotze
You may not need a read model
@koenighotze
Typical strategies for storing events
@koenighotze
User-topic
User A User B User C User D
@koenighotze
User-A User-C User-D
User-topic
User-B
Better: One stream per aggregate
@koenighotze
User
Microservice
GET /users/B
User-B
@koenighotze
User
Microservice
GET /users/B
User-B
@koenighotze
User
Microservice
GET /users/B
User-B
Each event type has a
corresponding handler function
@koenighotze
User
Microservice
GET /users/B
User-B
Which aggregate?
How shall events be
handled?
@koenighotze
Consistent read
No operational overhead
Super-simple programming logic
@koenighotze
But, what about speed?
@koenighotze#DevExperience18 #10TipsMicroservices
100 events: 66.047ms
@koenighotze
But, what about queries?
@koenighotze
@koenighotze
Build specific
query projections
@koenighotze
User-A User-C User-D
Adult-Users-Projection
User-B
@koenighotze
User-A User-C User-D
Adult-Users-Projection
User-B
@koenighotze
Handlers are often trivial
Prefer small aggregates
Measure first
Introduce read models only
if needed
@koenighotze
Transactions, concurrency and
your eventstore
@koenighotze
How can we guarantee
correctness when writing?
@koenighotze
The outcome of a business
operation depends on the
order of events
@koenighotze
The aggregate is responsible for
enforcing business invariants
@koenighotze
“Only withdraw money, if the bank
account holds enough money!”*
@koenighotze
“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…
@koenighotze
MoneyWithdrawn
amount: 50 EUR
I want in!
Nope!
Not enough money!
Account-123
Current account balance:
30 EUR
@koenighotze
The aggregate is the
“transaction boundary”
@koenighotze
Just use a
database for
handling
transactions
@koenighotze
Maybe not
@koenighotze
Are YOUR systems
single-threaded?
@koenighotze
Account
Microservice
Read
model
(SQL)
MoneyWithdrawn
Check if
account holds
enough money
Account
Microservice
MoneyWithdrawn
Check if
account holds
enough money
@koenighotze
Validation against a read model
is prone to inconsistencies
@koenighotze
Just use
distributed
transactions!
@koenighotze
…just joking
@koenighotze
Just manage
transactions with
a database and
use single-writer
@koenighotze
https://www.confluent.io/blog/messaging-single-source-truth/
@koenighotze
Quick tip for finding friends in ops:
Ask them just to install and
maintain production grade Kafka
and Couchbase installations on AWS
@koenighotze
https://en.wikipedia.org/wiki/Optimistic_concurrency_control
@koenighotze
https://en.wikipedia.org/wiki/Optimistic_concurrency_control
OCC assumes that multiple transactions
can frequently complete without
interfering with each other.
@koenighotze
https://en.wikipedia.org/wiki/Optimistic_concurrency_control
…each transaction verifies that no other
transaction has modified the data it has
read…
@koenighotze
The happy path
@koenighotze
Account
lastEventNumber: 5
Account-123
MoneyDeposited
eventNumber: 5
amount: 100 EUR
… … …
MoneyWithdrawn
amount: 10 EUR
holderId: …
accountNumber: …
amount: …
@koenighotze
Account-123
MoneyWithdrawn
amount: 10 EUR
Account
lastEventNumber: 5
holderId: …
accountNumber: …
amount: …
MoneyDeposited
eventNumber: 5
amount: 100 EUR
… … …
Account.lastEventNumber(5)
===
Stream.lastEventNumber(5)
@koenighotze
Account
lastEventNumber: 5
Account-123
MoneyDeposited
eventNumber: 5
amount: 100 EUR
MoneyWithdrawn
amount: 10 EUR
holderId: …
accountNumber: …
amount: …
eventNumber: 6
… … …
@koenighotze
The not-so-happy path
@koenighotze
Account
lastEventNumber: 4
Account-123
MoneyDeposited
eventNumber: 4
amount: 10 EUR
… … …
holderId: …
accountNumber: …
amount: …
@koenighotze
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
@koenighotze
Account
Microservice
PUT /account/1234
account-1234
@koenighotze
PUT /account/1234
Account
Microservice
account-1234
@koenighotze
PUT /account/1234
Account
Microservice
account-1234
@koenighotze
PUT /account/1234
Account
Microservice
account-1234
@koenighotze
PUT /account/1234
Account
Microservice
account-1234
@koenighotze
PUT /account/1234
Account
Microservice
account-1234
Optimistic
concurrency control
@koenighotze
And Kafka?
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze#DevExperience18 #10TipsMicroservices
…
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze
Scalability without locks
Consistency
Design choice
Super-simple programming logic
@koenighotze
Versions, up-front-design and
breaking things down the road
@koenighotze
How can we deal with
versions without going crazy?
@koenighotze
Just use semantic
versioning and typed
events
@koenighotze
Account-123
MoneyDepositedAccountOpened events-1.0.0.jar
Producer
Consumer
@koenighotze
…then change some event
types
@koenighotze
Account-123
……
events-1.0.0.jar
Producer
Consumer
events-2.0.0.jar
MoneyDeposited2
@koenighotze
@koenighotze
Gosh…just apply
“Double Write”
@koenighotze
Account-123
…… MoneyDeposited MoneyDeposited2
@koenighotze
Account-123
……
Consumer
MoneyDeposited MoneyDeposited2
Should I process V1?
@koenighotze
Account-123
……
Consumer
Or wait for a V2…which
might never arrive?
MoneyDeposited MoneyDeposited2
@koenighotze
MoneyDeposited_v1
MoneyDeposited_v2
…
MoneyDeposited_v100
@koenighotze
MoneyDeposited_v1Handler
MoneyDeposited_v2Handler
…
MoneyDeposited_v100Handler
@koenighotze
Just use an Upcaster
@koenighotze
Account-123
A V1.0……
Consumer
Upcaster
A V1.0 B V2.0
A V2.0
A V2.0
f: v1->v2
@koenighotze
5 months later…
@koenighotze
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
@koenighotze
Good luck maintaining
that monster
@koenighotze
Incompatible event changes
indicate a new event
@koenighotze
Prefer simple, text-based,
human readable events
@koenighotze
Fancy speak for JSON
@koenighotze
@koenighotze
And correctness?
@koenighotze
String-ly typed events work
really well
@koenighotze
Weak schema to the rescue
@koenighotze
@koenighotze
@koenighotze
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze
Schema-on-Read
@koenighotze
Reusing event data?
@koenighotze
Transactionledger
Microservice
Budget Planer
Microservice
@koenighotze
Transactionledger
Microservice
Budget Planer
Microservice
TransactionBooked TransactionTagged
@koenighotze
Just copy data into
different events, just
so convenient
@koenighotze
TransactionBooked
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
@koenighotze
TransactionBooked
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
TransactionTagged
tagId: …
categoryName: “…”
transactionId: …
amount: …
currency: …
@koenighotze
TransactionBooked
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
TransactionTagged
tagId: …
categoryName: “…”
transactionId: …
amount: …
currency: …
@koenighotze
Budget Planer
Microservice
But I need to
display the
transaction
purpose, too
@koenighotze
TransactionBooked
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
TransactionTagged
tagId: …
categoryName: “…”
transactionId: …
amount: …
currency: …
???
@koenighotze
The lossy event
@koenighotze
Only reference aggregates
via their root id or event ids
@koenighotze
TransactionBooked
eventId:…
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
TransactionTagged
tagId: …
categoryName: “…”
txBookedEventId: …
transactionId: …
@koenighotze
Domain service
tagId: …
categoryName: “…”
purpose: “…”
transactionId: …
amount: …
currency: …
TransactionBooked
eventId:…
transactionId: …
TransactionTagged
txBookedEventId: …
transactionId: …
@koenighotze
Domain service
tagId: …
categoryName: “…”
purpose: “…”
transactionId: …
amount: …
currency: …
TransactionBooked
eventId:…
transactionId: …
TransactionTagged
txBookedEventId: …
transactionId: …
Good candidate for a
read model
@koenighotze
Don’t copy parts of an event
Prefer building use case specific
projections and domain services
@koenighotze
How do I handle large streams?
@koenighotze
How can you handle event data
over a long period of time?
@koenighotze
You don’t
@koenighotze
Just create a snapshot
of the stream
@koenighotze
Year’s end procedure
@koenighotze
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
@koenighotze
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.
@koenighotze
Copy-Transform
@koenighotze
a.k.a. event sourcing
refactoring powertool
@koenighotze
AccountCreated
…
MoneyTransferred
…
. . .
2017
@koenighotze
AccountCreated
…
MoneyTransferred
…
. . .
Initialized
…
Deactivated
…
. . .
AccountCreated
…
MoneyTransferred
…
2017
2018
NEVER DELETE
THIS!
@koenighotze
Transactionledger
Microservice
Initialized
…
Deactivated
…
. . .
. . .2017 2018
Hic sunt
leones
@koenighotze
Same idea if you need to
remodel your domain!
@koenighotze
The FooANDBarEvent
@koenighotze
. . .
TransferredAndBooked
Typical modelling
mistake
@koenighotze
. . .
Initialized
Transferred
Booked
TransferredAndBooked
Deactivated
. . .
TransferredAndBooked
@koenighotze
The devil is in the detail
@koenighotze
Dealing with errors
@koenighotze
MoneyTransferred
eventId: 231233
amount: 97 Euro
withdrawnAt: 2018-08-30T08:58:26.624
@koenighotze
Just update the
event in the
eventstore!
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze
Challenges?
@koenighotze
Account-123
……
Consumer
…… …
@koenighotze
Consumer
Update …
 ¯_(ツ)_/¯
Account-123
…… …… …
I already know
that event.
Why should I
re-read?
@koenighotze
Ok. Then just use
compensation events
@koenighotze
The cancelled or corrected event
@koenighotze
Full compensation
- do as accountants do
@koenighotze
MoneyTransferCancelled
eventId: 2
reasonEventId: 1
reason: …
MoneyTransferred
eventId: 1
amount: 97 Euro
…
MoneyTransferred
eventId: 3
amount: 97 EUR
…
@koenighotze
A full compensation is the
explicit reason for compensation
@koenighotze
GDPR, compliance
and eventsourcing
@koenighotze
GDPR
@koenighotze
@koenighotze
@koenighotze
Just encrypt and throw
the key away
@koenighotze
Stream
EventEvent Event
…
PayloadPayload Payload
Stream
EventEvent Event
…
PayloadPayload Payload
Stream
EventEvent Event
…
PayloadPayload Payload
@koenighotze
“Please delete all my data”
@koenighotze
Deletion is effectively deleting
the stream-specific key
@koenighotze
Stream
EventEvent Event
…
PayloadPayload Payload
Stream
EventEvent Event
…
PayloadPayload Payload
Stream
EventEvent Event
…
PayloadPayload Payload
?
@koenighotze
Challenges?
@koenighotze
Key administration
Finding what needs to be
deleted
Storage implications
Coding complexity
Dashboards, Monitoring
@koenighotze
Being able to delete is
awesome
@koenighotze
Cascading deletes with
tombstones
@koenighotze
“Please delete USER-456”
@koenighotze
User
Bankaccount
Transaction-
ledger
@koenighotze
User
Microservice
Bankaccount
Microservice
Transactionledger
Microservice
User-456
Deleted
Bank-
account-123
Deleted
@koenighotze
User-456
… … …
Eventstore
delete
User-456
Deleted
emit
tombstone
event
User Microservice
deleteStream(‘User-456’)
@koenighotze
@koenighotze
What about dependencies
between aggregates?
@koenighotze
Just anonymise the
data
@koenighotze
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.
@koenighotze
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.
@koenighotze
What if I delete a confluence account?
@koenighotze
@koenighotze
Public/private data
@koenighotze
User-Public-456
Id Blue
User-Private-456
Schmitz David D-AW-123
@koenighotze
User-Public-456
Id Blue
User-Private-456
Schmitz David D-AW-123
Keep this
@koenighotze
User-Public-456
Id Blue
User-Private-456
Schmitz David D-AW-123Delete this
@koenighotze
You may be able to keep
references to the public data
@koenighotze
Surprise: No easy answers
@koenighotze
Ask your lawyer or CISO
@koenighotze
That’s it?
@koenighotze
Microservices + DDD + ES=
Needs more up-front design
You can refactor, you can clean up
Not enough in-depth books
Avoid framework lock-in
Beware: “just…” or “…made easy”
@koenighotze
Forget this talk…
read some papers
@koenighotze
@koenighotze
eventmodeling.org
@koenighotze
Choose the “right” tool?
@koenighotze#DevExperience18 #10TipsMicroservices
eventstore.org
@koenighotze
Thank
you!
Questions and
Feedback?
@Koenighotze

More Related Content

What's hot

Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...
Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...
Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...VMware Tanzu
 
Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...
Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...
Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...Codemotion
 
Lessons from running AppSync in prod
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prodYan Cui
 
ReactJS.NET - Fast and Scalable Single Page Applications
ReactJS.NET - Fast and Scalable Single Page ApplicationsReactJS.NET - Fast and Scalable Single Page Applications
ReactJS.NET - Fast and Scalable Single Page ApplicationsRick Beerendonk
 
What I learned teaching programming to 150 beginners
What I learned teaching programming to 150 beginnersWhat I learned teaching programming to 150 beginners
What I learned teaching programming to 150 beginnersEtiene Dalcol
 
Railsconf 2014 - Deploying Rails is Easier Thank It Looks
Railsconf 2014 - Deploying Rails is Easier Thank It LooksRailsconf 2014 - Deploying Rails is Easier Thank It Looks
Railsconf 2014 - Deploying Rails is Easier Thank It Lookstalkingquickly
 

What's hot (6)

Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...
Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...
Drinking from the Stream: How to Use Messaging Platforms for Scalability & Pe...
 
Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...
Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...
Web is the New Mobile: Building Progressive Web Apps - Erica Stanley - Codemo...
 
Lessons from running AppSync in prod
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prod
 
ReactJS.NET - Fast and Scalable Single Page Applications
ReactJS.NET - Fast and Scalable Single Page ApplicationsReactJS.NET - Fast and Scalable Single Page Applications
ReactJS.NET - Fast and Scalable Single Page Applications
 
What I learned teaching programming to 150 beginners
What I learned teaching programming to 150 beginnersWhat I learned teaching programming to 150 beginners
What I learned teaching programming to 150 beginners
 
Railsconf 2014 - Deploying Rails is Easier Thank It Looks
Railsconf 2014 - Deploying Rails is Easier Thank It LooksRailsconf 2014 - Deploying Rails is Easier Thank It Looks
Railsconf 2014 - Deploying Rails is Easier Thank It Looks
 

Similar to Eventsourcing you-are-doing-it-wrong-vxdparis

Event Sourcing - You are doing it wrong @ Devoxx
Event Sourcing - You are doing it wrong @ DevoxxEvent Sourcing - You are doing it wrong @ Devoxx
Event Sourcing - You are doing it wrong @ DevoxxDavid Schmitz
 
Moving away from legacy code with BDD
Moving away from legacy code with BDDMoving away from legacy code with BDD
Moving away from legacy code with BDDKonstantin Kudryashov
 
Eventos y Microservicios - Santander TechTalk
Eventos y Microservicios - Santander TechTalkEventos y Microservicios - Santander TechTalk
Eventos y Microservicios - Santander TechTalkconfluent
 
DDD Belgium Meetup 2017: Events, flows and long running services
DDD Belgium Meetup 2017: Events, flows and long running servicesDDD Belgium Meetup 2017: Events, flows and long running services
DDD Belgium Meetup 2017: Events, flows and long running servicesBernd Ruecker
 
When e-commerce meets Symfony
When e-commerce meets SymfonyWhen e-commerce meets Symfony
When e-commerce meets SymfonyMarc Morera
 
[API World 2021 ] - Understanding Cloud Native Deployment
[API World 2021 ] - Understanding Cloud Native Deployment[API World 2021 ] - Understanding Cloud Native Deployment
[API World 2021 ] - Understanding Cloud Native DeploymentWSO2
 
Azure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea SaltarelloAzure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea SaltarelloITCamp
 
Azure Day Rome Reloaded 2019 - Reactive Systems with Event Grid
Azure Day Rome Reloaded 2019 - Reactive Systems with Event GridAzure Day Rome Reloaded 2019 - Reactive Systems with Event Grid
Azure Day Rome Reloaded 2019 - Reactive Systems with Event Gridazuredayit
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Chris Richardson
 
Opportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven UtopiaOpportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven UtopiaC4Media
 
Running in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure projectRunning in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure projectMaarten Balliauw
 
Running in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure projectRunning in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure projectMaarten Balliauw
 
Building microservices with Scala, functional domain models and Spring Boot (...
Building microservices with Scala, functional domain models and Spring Boot (...Building microservices with Scala, functional domain models and Spring Boot (...
Building microservices with Scala, functional domain models and Spring Boot (...Chris Richardson
 
Progressive web and the problem of JavaScript
Progressive web and the problem of JavaScriptProgressive web and the problem of JavaScript
Progressive web and the problem of JavaScriptChristian Heilmann
 
Event Sourcing with Kotlin, who needs frameworks!
Event Sourcing with Kotlin, who needs frameworks!Event Sourcing with Kotlin, who needs frameworks!
Event Sourcing with Kotlin, who needs frameworks!Nico Krijnen
 
How serverless changes the cost paradigm
How serverless changes the cost paradigmHow serverless changes the cost paradigm
How serverless changes the cost paradigmYan Cui
 
RTP Bluemix Meetup April 20th 2016
RTP Bluemix Meetup April 20th 2016RTP Bluemix Meetup April 20th 2016
RTP Bluemix Meetup April 20th 2016Tom Boucher
 
IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...
IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...
IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...Kai Wähner
 
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...Chris Richardson
 

Similar to Eventsourcing you-are-doing-it-wrong-vxdparis (20)

Event Sourcing - You are doing it wrong @ Devoxx
Event Sourcing - You are doing it wrong @ DevoxxEvent Sourcing - You are doing it wrong @ Devoxx
Event Sourcing - You are doing it wrong @ Devoxx
 
Moving away from legacy code with BDD
Moving away from legacy code with BDDMoving away from legacy code with BDD
Moving away from legacy code with BDD
 
Eventos y Microservicios - Santander TechTalk
Eventos y Microservicios - Santander TechTalkEventos y Microservicios - Santander TechTalk
Eventos y Microservicios - Santander TechTalk
 
DDD Belgium Meetup 2017: Events, flows and long running services
DDD Belgium Meetup 2017: Events, flows and long running servicesDDD Belgium Meetup 2017: Events, flows and long running services
DDD Belgium Meetup 2017: Events, flows and long running services
 
When e-commerce meets Symfony
When e-commerce meets SymfonyWhen e-commerce meets Symfony
When e-commerce meets Symfony
 
[API World 2021 ] - Understanding Cloud Native Deployment
[API World 2021 ] - Understanding Cloud Native Deployment[API World 2021 ] - Understanding Cloud Native Deployment
[API World 2021 ] - Understanding Cloud Native Deployment
 
Azure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea SaltarelloAzure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
Azure tales: a real world CQRS and ES Deep Dive - Andrea Saltarello
 
Azure Day Rome Reloaded 2019 - Reactive Systems with Event Grid
Azure Day Rome Reloaded 2019 - Reactive Systems with Event GridAzure Day Rome Reloaded 2019 - Reactive Systems with Event Grid
Azure Day Rome Reloaded 2019 - Reactive Systems with Event Grid
 
JavaScript isn't evil.
JavaScript isn't evil.JavaScript isn't evil.
JavaScript isn't evil.
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)
 
Opportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven UtopiaOpportunities and Pitfalls of Event-Driven Utopia
Opportunities and Pitfalls of Event-Driven Utopia
 
Running in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure projectRunning in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure project
 
Running in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure projectRunning in the Cloud - First Belgian Azure project
Running in the Cloud - First Belgian Azure project
 
Building microservices with Scala, functional domain models and Spring Boot (...
Building microservices with Scala, functional domain models and Spring Boot (...Building microservices with Scala, functional domain models and Spring Boot (...
Building microservices with Scala, functional domain models and Spring Boot (...
 
Progressive web and the problem of JavaScript
Progressive web and the problem of JavaScriptProgressive web and the problem of JavaScript
Progressive web and the problem of JavaScript
 
Event Sourcing with Kotlin, who needs frameworks!
Event Sourcing with Kotlin, who needs frameworks!Event Sourcing with Kotlin, who needs frameworks!
Event Sourcing with Kotlin, who needs frameworks!
 
How serverless changes the cost paradigm
How serverless changes the cost paradigmHow serverless changes the cost paradigm
How serverless changes the cost paradigm
 
RTP Bluemix Meetup April 20th 2016
RTP Bluemix Meetup April 20th 2016RTP Bluemix Meetup April 20th 2016
RTP Bluemix Meetup April 20th 2016
 
IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...
IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...
IoT Architectures for a Digital Twin with Apache Kafka, IoT Platforms and Mac...
 
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
 

More from David Schmitz

Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group RheinlandDavid Schmitz
 
10 Tipps für ein absolutes Microservice-Desaster
10 Tipps für ein absolutes Microservice-Desaster10 Tipps für ein absolutes Microservice-Desaster
10 Tipps für ein absolutes Microservice-DesasterDavid Schmitz
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017David Schmitz
 
Elixir - Easy fun for busy developers @ Devoxx 2016
Elixir - Easy fun for busy developers @ Devoxx 2016Elixir - Easy fun for busy developers @ Devoxx 2016
Elixir - Easy fun for busy developers @ Devoxx 2016David Schmitz
 
Javaslang - Functional Sugar For Java
Javaslang - Functional Sugar For JavaJavaslang - Functional Sugar For Java
Javaslang - Functional Sugar For JavaDavid Schmitz
 
Bootstrap |> Elixir - Easy fun for busy developers
Bootstrap |> Elixir - Easy fun for busy developersBootstrap |> Elixir - Easy fun for busy developers
Bootstrap |> Elixir - Easy fun for busy developersDavid Schmitz
 
Resilience testing with Wiremock and Spock
Resilience testing with Wiremock and SpockResilience testing with Wiremock and Spock
Resilience testing with Wiremock and SpockDavid Schmitz
 
Docker for the Brave
Docker for the BraveDocker for the Brave
Docker for the BraveDavid Schmitz
 
Spring boot - Getting Started
Spring boot - Getting StartedSpring boot - Getting Started
Spring boot - Getting StartedDavid Schmitz
 

More from David Schmitz (11)

Going Cloud Native
Going Cloud NativeGoing Cloud Native
Going Cloud Native
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group Rheinland
 
10 Tipps für ein absolutes Microservice-Desaster
10 Tipps für ein absolutes Microservice-Desaster10 Tipps für ein absolutes Microservice-Desaster
10 Tipps für ein absolutes Microservice-Desaster
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017
 
Elixir - Easy fun for busy developers @ Devoxx 2016
Elixir - Easy fun for busy developers @ Devoxx 2016Elixir - Easy fun for busy developers @ Devoxx 2016
Elixir - Easy fun for busy developers @ Devoxx 2016
 
Javaslang @ Devoxx
Javaslang @ DevoxxJavaslang @ Devoxx
Javaslang @ Devoxx
 
Javaslang - Functional Sugar For Java
Javaslang - Functional Sugar For JavaJavaslang - Functional Sugar For Java
Javaslang - Functional Sugar For Java
 
Bootstrap |> Elixir - Easy fun for busy developers
Bootstrap |> Elixir - Easy fun for busy developersBootstrap |> Elixir - Easy fun for busy developers
Bootstrap |> Elixir - Easy fun for busy developers
 
Resilience testing with Wiremock and Spock
Resilience testing with Wiremock and SpockResilience testing with Wiremock and Spock
Resilience testing with Wiremock and Spock
 
Docker for the Brave
Docker for the BraveDocker for the Brave
Docker for the Brave
 
Spring boot - Getting Started
Spring boot - Getting StartedSpring boot - Getting Started
Spring boot - Getting Started
 

Recently uploaded

Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...Karmanjay Verma
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Jeffrey Haguewood
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessWSO2
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfAarwolf Industries LLC
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Mark Simos
 
Français Patch Tuesday - Avril
Français Patch Tuesday - AvrilFrançais Patch Tuesday - Avril
Français Patch Tuesday - AvrilIvanti
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneUiPathCommunity
 

Recently uploaded (20)

Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with Platformless
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdf
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
 
Français Patch Tuesday - Avril
Français Patch Tuesday - AvrilFrançais Patch Tuesday - Avril
Français Patch Tuesday - Avril
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyone
 

Eventsourcing you-are-doing-it-wrong-vxdparis