SlideShare a Scribd company logo
1 of 206
Download to read offline
@koenighotze
Eventsourcing - You are
doing it wrong
@koenighotze
Eventsourcing - You are doing
it wrong because I know best
@koenighotze
Eventsourcing - You are maybe
doing 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
Eventsourcing - You are
probably doing it wrong
@koenighotze
David Schmitz
Senacor Technologies
@koenighotze
@koenighotze
Are YOU building microservices?
Are YOU doing Domain Driven Design?
Are YOU applying eventsourcing?
Are YOU using Kafka as an eventstore?
@koenighotze
@koenighotze
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
@koenighotze
What we’ll cover!
@koenighotze
Eventsourcing bootcamp
@koenighotze
Eventsourcing from an architects perspective
@koenighotze
Kafka
Microservice
Read
modelEvents
Microservice
Read
modelEvents
Microservice
Read
modelEvents
THE DATA LAKE!
@koenighotze
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!
@koenighotze
“Just” in Action
@koenighotze
The idea in basic terms
@koenighotze
Domain driven design
Event driven architecture
Distributed systems
@koenighotze#DevExperience18 #10TipsMicroservices
Start with your domain
Find the bounded contexts
Find the root aggregates
Find events in your
ubiquitous language
@koenighotze
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
@koenighotze
User-Stream
UserOnboarded
email: foo@bar.de
address: …
UserRegistered
userId: 9714de5c…
UserRelocated
newAddress: …
Direction of time
@koenighotze
User Aggregate
userId: 9714de5c…
email: foo@bar.de
address: <new address>
Represents
the user at
the time of
the last
event read
@koenighotze
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
@koenighotze
Read models
…and why you may not need to them (initially)
@koenighotze
Read models are local hydrates of
the events stored in specific streams
@koenighotze
readModel = Stream.of(events)
.leftFold(handlers)
@koenighotze
How can we handle 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… 4 David qux@ba.ze …
4532… 7 Martin null …
@koenighotze
User
Microservice
Read
model
(SQL)
Neo4J
@koenighotze
Challenges?
@koenighotze
Eventual consistency
Replays
Re-deliveries
Operational complexity
@koenighotze
You may not need a read model
@koenighotze
Typical strategies for storing events
@koenighotze
Maybe all events of an aggregate
type in a single stream?
@koenighotze
Users
User A User B User C User D
@koenighotze
User-A User-C User-D
Users
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
@koenighotze
Consistent read
No operational overhead
Super-simple programming logic
@koenighotze
But, what about speed?
@koenighotze
What about queries like ‘all
users with age > 18’?
@koenighotze
User-A User-C User-D
Adult-Users-Projection
User-B
@koenighotze
But I can use a readmodel
for fast validation, can I?
@koenighotze
Maybe not
@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
Prefer validating against the eventstore itself
@koenighotze
Most event handlers are neither CPU
or IO intensive
Prefer small aggregates, if it makes
sense in your domain
Measure and introduce persistent
read models only if needed
@koenighotze
Transactions, concurrency
and your eventstore
@koenighotze
How can we guarantee
correctness when writing?
@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
Are YOUR systems single-threaded?
@koenighotze
Account
Microservice
Account
Microservice
Account
Microservice
Account-123
…
MoneyWithdrawn
amount: 97 EUR
MoneyDeposited
amount: 50 EUR
MoneyWithdrawn
amount: 10 EUR
MoneyDeposited
amount: 100 EUR
……
@koenighotze
The correctness of the
business result
depends on the order
of events
@koenighotze
MoneyWithdrawn
amount: 97 EUR
MoneyDeposited
amount: 100 EUR
MoneyDeposited
amount: 50 EUR
100 EUR
MoneyWithdrawn
amount: 10 EUR 90 EUR
-7 EUR
140 EUR
@koenighotze
Let’s shuffle
@koenighotze
140 EUR
MoneyWithdrawn
amount: 97 EUR
MoneyWithdrawn
amount: 10 EUR
MoneyDeposited
amount: 100 EUR
MoneyDeposited
amount: 50 EUR
100 EUR
90 EUR
43 EUR
@koenighotze
The aggregate is responsible for
enforcing business invariants
@koenighotze#DevExperience18 #10TipsMicroservices
Account-123
MoneyWithdrawn
amount: 50 EUR
I want in!
Not if you mess up my
internal business rules!
Account balance:
30 EUR
@koenighotze
“Just” add a database
in front of your
eventstore!
@koenighotze#DevExperience18 #10TipsMicroservices
https://www.confluent.io/blog/messaging-single-source-truth/
@koenighotze
Quick tip for finding friends in ops:
Ask them to “just” install and maintain
production ready Kafka and
Couchbase installations in the Cloud
@koenighotze#DevExperience18 #10TipsMicroservices
https://en.wikipedia.org/wiki/Optimistic_concurrency_control
@koenighotze#DevExperience18 #10TipsMicroservices
https://en.wikipedia.org/wiki/Optimistic_concurrency_control
OCC assumes that multiple transactions
can frequently complete without
interfering with each other.
@koenighotze#DevExperience18 #10TipsMicroservices
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-123
… … …
MoneyDeposited
eventNumber: 5
amount: 100 EUR
Account
lastEventNumber: 4
holderId: …
accountNumber: …
amount: …
Account.lastEventNumber(4)
==
Stream.lastEventNumber(5)
MoneyWithdrawn
amount: 97 EUR
@koenighotze
Account
Microservice
PUT /account/1234
account-12
34
@koenighotze
Account
Microservice
account-12
34
PUT /account/1234
@koenighotze
Account
Microservice
account-12
34
PUT /account/1234
@koenighotze
And Kafka?
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze#DevExperience18 #10TipsMicroservices
…
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze
Advantages of OCC?
@koenighotze
Scalability and no 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 types
@koenighotze#DevExperience18 #10TipsMicroservices
Account-123
MoneyDepositedAccountOpened events-1.0.0.jar
Producer
Consumer
@koenighotze
…then change some event types
@koenighotze#DevExperience18 #10TipsMicroservices
Account-123
MoneyDepositedAccountOpened events-1.0.0.jar
Producer
Consumer
@koenighotze#DevExperience18 #10TipsMicroservices
Account-123
……
events-1.0.0.jar
Producer
Consumer
events-2.0.0.jar
MoneyDeposited
@koenighotze#DevExperience18 #10TipsMicroservices
@koenighotze
Gosh…“just” apply
Double Write
@koenighotze
Account-123
…… MoneyDepositedV1 MoneyDepositedV2
@koenighotze
Account-123
……
ConsumerShould I process V1?
MoneyDepositedV1 MoneyDepositedV2
@koenighotze
Account-123
……
Consumer
Or wait for a V2…which
might never arrive?
MoneyDepositedV1 MoneyDepositedV2
@koenighotze
MoneyDeposited_v1
MoneyDeposited_v2
…
MoneyDeposited_v100
@koenighotze
MoneyDeposited_v1Handler
MoneyDeposited_v2Handler
…
MoneyDeposited_v100Handler
@koenighotze
Upcaster
@koenighotze#DevExperience18 #10TipsMicroservices
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#DevExperience18 #10TipsMicroservices
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
Prefer simple, text-based,
human readable events
@koenighotze
Fancy speak for JSON
@koenighotze
@koenighotze
And correctness?
@koenighotze
“Just” generate
classes for JSON
mapping!
@koenighotze
@koenighotze
NGINX $request_id
unique request identifier
generated from 16 random bytes,
in hexadecimal (1.11.0)
@koenighotze
“Oh, you changed the request id
from uuid to any arbitrary string”
@koenighotze
String-ly typed events work really well
@koenighotze
Weak schema to the rescue
@koenighotze
@koenighotze
@koenighotze
@koenighotze
@koenighotze
@koenighotze
Schema as a description
not as a contract
@koenighotze
Producer
Event
Schema
Consumerhandles
emits
asserts
correctness
using
@koenighotze
What about putting
versioned logic in handlers?
@koenighotze
MoneyTransferred
eventId: 5
amount: 97 USD
@koenighotze
@koenighotze
@koenighotze
@koenighotze
@koenighotze
Bravo, now your expense report of 2017
depends on today’s exchange rates
@koenighotze
Creating an event must encapsulate all
data that lead to the emitting of the event
@koenighotze
MoneyTransferred
eventId: 5
amount: 97 USD
exchangeRate": {
"base": "USD",
"date": "2018-02-13",
"rates": { "EUR": 0.806942 }
}
@koenighotze
MoneyTransferred
eventId: 5
amount: 97 USD
exchangeRate": {
"base": "USD",
"date": "2018-02-13",
"rates": { "EUR": 0.806942 }
}
amount: 97 USD
exchangeRate": {
"base": "USD",
"date": "2018-02-13",
"rates": { "EUR": 0.806942 }
}
Side-effect
manifested as
event payload
@koenighotze
Reduce stream-replay headaches by
storing side-effects as event results
@koenighotze
Reusing event data?
@koenighotze
Transactionledger
Microservice
Budget Planer
Microservice
@koenighotze
TransactionBooked TransactionCategorised
Transactionledger
Microservice
Budget Planer
Microservice
@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: …
TransactionCategorised
tagId: …
categoryName: “…”
transactionId: …
amount: …
currency: …
@koenighotze
TransactionBooked
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
TransactionCategorised
tagId: …
categoryName: “…”
transactionId: …
amount: …
currency: …
@koenighotze
Budget Planer
Microservice
But I need to
display the
transaction
purpose, too
@koenighotze
TransactionBooked TransactionCategorised
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
tagId: …
categoryName: “…”
transactionId: …
amount: …
currency: …
????
@koenighotze
The lossy event
@koenighotze
Only reference aggregates via their root id
@koenighotze
TransactionBooked TransactionCategorised
transactionId: …
accountNumber: …
amount: …
currency: …
bookingTime: …
purpose: …
tagId: …
categoryName: “…”
transactionId: …
@koenighotze
TransactionBooked TransactionCategorised
transactionId: … transactionId: …
Domain service
tagId: …
categoryName: “…”
purpose: “…”
transactionId: …
amount: …
currency: …
@koenighotze
TransactionBooked TransactionCategorised
transactionId: … transactionId: …
Domain service
tagId: …
categoryName: “…”
purpose: “…”
transactionId: …
amount: …
currency: …
Good candidate for
a read model resp.
projection btw.
@koenighotze
Don’t copy parts of an event.
Prefer building use case
specific projections
@koenighotze
How can you handle event data
over a long period of time?
@koenighotze
You don’t
@koenighotze
“Just” take 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. eventsourcing refactoring powertool
@koenighotze#DevExperience18 #10TipsMicroservices
AccountCreated
…
MoneyTransferred
…
. . .
2017
@koenighotze#DevExperience18 #10TipsMicroservices
AccountCreated
…
MoneyTransferred
…
. . .
Initialized
…
Deactivated
…
. . .
AccountCreated
…
MoneyTransferred
…
2017
2018
@koenighotze#DevExperience18 #10TipsMicroservices
Transactionledger
Microservice
Initialized
…
Deactivated
…
. . .
. . .2017 2018
@koenighotze
Same idea if you need to
remodel your domain!
@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
@koenighotze
No!
@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
Partial compensation?
@koenighotze
MoneyTransferAmountCorrected
eventId: 2
amount: 97 EUR
eventId: 1
MoneyTransferred
eventId: 1
amount: 97 Euro
…
@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
The full compensation makes the
reason for compensation explicit
@koenighotze
Consumers must mostly be forward and
backward compatible
Beware lossy events
Prefer projections to event data copying
Refer across aggregates using root ids
@koenighotze
GDPR, compliance
and eventsourcing
@koenighotze
GDPR
@koenighotze
@koenighotze
@koenighotze
“Just” encrypt and
throw the key away
@koenighotze
Every stream is encrypted
using a stream-specific key
@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
Key administration
Finding what needs to be deleted
Storage implications
Coding complexity
Dashboards, Monitoring
@koenighotze
Being able to delete is awesome
@koenighotze
User
Bankaccount
Transaction
-ledger
@koenighotze
“Please delete all my data”
@koenighotze
Cascading deletes with tombstones
@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
Bankaccount-123
AccountOpened
owner: user-456
…
Bankaccount
Microservice
User-456
Deleted
Eventstore
delete
Bank-
account-
123
Deleted
emit
tombstone event
deleteStream(‘Bankaccount-123’)
@koenighotze
@koenighotze
Dealing with dependent events
@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
“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
Surprise: No easy answers
@koenighotze
Ask your lawyer or CISO
@koenighotze
That’s it?
@koenighotze
ES + DDD =
Needs more up-front design
You can refactor, you can clean up
Not enough in-depth books
Avoid frameworks
Beware: “just…” or “…made easy”
@koenighotze
Forget this talk…read these:
@koenighotze
Choose the right tool?
@koenighotze
@koenighotze
Thank you!
Questions?
Comments?
Blame?
@Koenighotze

More Related Content

More from David Schmitz

10 Tips for failing at microservices - badly (BedCon 2017)
10 Tips for failing at microservices - badly (BedCon 2017)10 Tips for failing at microservices - badly (BedCon 2017)
10 Tips for failing at microservices - badly (BedCon 2017)David Schmitz
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017David Schmitz
 
10 Tips for failing at microservices
10 Tips for failing at microservices10 Tips for failing at microservices
10 Tips for failing at microservicesDavid 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 (10)

10 Tips for failing at microservices - badly (BedCon 2017)
10 Tips for failing at microservices - badly (BedCon 2017)10 Tips for failing at microservices - badly (BedCon 2017)
10 Tips for failing at microservices - badly (BedCon 2017)
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017
 
10 Tips for failing at microservices
10 Tips for failing at microservices10 Tips for failing at microservices
10 Tips for failing at microservices
 
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

Introduction to IEEE STANDARDS and its different types.pptx
Introduction to IEEE STANDARDS and its different types.pptxIntroduction to IEEE STANDARDS and its different types.pptx
Introduction to IEEE STANDARDS and its different types.pptxupamatechverse
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduitsrknatarajan
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escortsranjana rawat
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingrakeshbaidya232001
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Call Girls in Nagpur High Profile
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)Suman Mia
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performancesivaprakash250
 
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordCCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordAsst.prof M.Gokilavani
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxAsutosh Ranjan
 
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxupamatechverse
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Dr.Costas Sachpazis
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSKurinjimalarL3
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130Suhani Kapoor
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations120cr0395
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 

Recently uploaded (20)

Introduction to IEEE STANDARDS and its different types.pptx
Introduction to IEEE STANDARDS and its different types.pptxIntroduction to IEEE STANDARDS and its different types.pptx
Introduction to IEEE STANDARDS and its different types.pptx
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduits
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writing
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)Software Development Life Cycle By  Team Orange (Dept. of Pharmacy)
Software Development Life Cycle By Team Orange (Dept. of Pharmacy)
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordCCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptx
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
Roadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and RoutesRoadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and Routes
 
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINEDJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 

Eventsourcing - you are doing it wrong @ BedCon 2018 edition