Professional Documents
Culture Documents
Universe of Users
users
Id
Name
Username
APIKey
Homer
homer
d0a
Bart
bart
f00
Maggie
maggie
baa
Universe of Users
users
Id
Name
Username
APIKey
Homer
homer
d0a
Bart
bart
f00
Lisa Jr
maggie
baa
Universe of Users
users
Id
Name
Username
APIKey
Homer
homers
d0a
Bart
bart
f00
Lisa Jr
maggie
baa
Universe of Users
users
Id
Name
Username
APIKey
Homer
homer
d0a
Bart
bart
f00
Maggie
maggie
baa
events
Seq
Event
Time
123
SetUsername(3, Maggie)
Universe of Users
users
Id
Name
Username
APIKey
Homer
homer
d0a
Bart
bart
f00
Lisa Jr
maggie
baa
events
Seq
Event
Time
123
SetUsername(3, Maggie)
124
10
Universe of Users
users
Id
Name
Username
APIKey
Homer
homers
d0a
Bart
bart
f00
Lisa Jr
maggie
baa
events
Seq
Event
Time
123
SetUsername(3, Maggie)
124
10
125
SetUsername(1, homers)
15
Universe of Users
users
Id
Name
Username
APIKey
Homer
homers
d0a
Bart
bart
f00
Lisa Jr
maggie
baa
users_new
Id
Name
Derived
Homer
Homer1
Bart
Bart2
Lisa Jr
Lisa Jr3
events
Seq
Event
Time
123
SetUsername(3, Maggie)
124
10
125
SetUsername(1, homers)
15
Universe of Users
users
Id
Name
Username
APIKey
Homer
homers
d0a
Bart
bart
f00
Lisa Jr
maggie
baa
users_new
Id
Name
Derived
Homer
Homer1
Bart
Bart2
Lisa Jr
Lisa Jr3
events
Seq
Event
Time
123
SetUsername(3, Maggie)
124
10
125
SetUsername(1, homers)
15
Highly available
Disaster recovery
Zero-downtime upgrades
Highly available
Disaster recovery
Zero-downtime upgrades
Evolving the
architecture
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
SaveAPI
Query
Query
Query
views
views
views
EventStream
DynamoDB
REST calls
e.g. Add User
Core app
Services
Commands
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
EventStream
EventStream
EventStream
DynamoDB
Query
Query
Query
views
views
views
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
Query
Query
Query
views
views
views
EventStream
EventStream
EventStream
Events
DynamoDB
Lambda
Kinesis
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
Query
Query
Query
views
views
views
EventStream
EventStream
EventStream
ElasticSearch
Events
DynamoDB
Lambda
Kinesis
REST calls
e.g. Add User
Core app
Services
Commands
Query
sync
Query
Query
Query
views
views
views
EventStream
EventStream
EventStream
ElasticSearch
Events
DynamoDB
Lambda
Kinesis
REST calls
e.g. Add User
Groups
Services
Commands
Query
sync
Query
Query
Query
views
views
views
EventStream
EventStream
EventStream
Platform
Events
DynamoDB
Lambda
Kinesis
REST calls
e.g. Add User
Groups
Services
Commands
Query
sync
Query
Query
Query
views
views
views
EventStream
EventStream
EventStream
Platform
Events
Users
DynamoDB
Lambda
Kinesis
REST calls
e.g. Add User
Groups
Services
Commands
Query
sync
Query
Query
Query
views
views
views
EventStream
EventStream
EventStream
External
Events
Platform
Events
Users
DynamoDB
Lambda
Kinesis
Event
Txf
Kinesis
Delving into
code
Services
Command
handlers
Query
handlers
Services
Command
handlers
command.Op ~>
Result
Query
handlers
query.Op ~>
Result
Services
Command
handlers
command.Op ~>
Result
Query
handlers
query.Op ~>
Result
Web
Services
Command
handlers
command.Op ~>
Result
Query
handlers
query.Op ~>
Result
case ...
} yield ()
}
}
qs.synchronise(stream).attemptRunFor(...)
Events as an API
vs
Set events
vs
Set events
vs
Set events
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
vs
Set events
SetUserName(id, name)
SetUserEmail(id, email1)
SetUserEmail(id, email2)
Single stream
Multiple streams
Single stream
Transactions and
consistent data
resolution
Multiple streams
Single stream
Multiple streams
Transactions and
consistent data
resolution
Sharding for
throughput
Let go of
transactions
and consistency
Core App
Client
Create User A
Client
Create User A
Token TU1
Client
Create User A
Token TU1
Create Group B
Client
Create User A
Token TU1
Create Group B
Token TG1
Client
Create User A
Token TU1
Create Group B
Token TG1
Add User A to Group B (tokens TU1, TG1)
Client
Create User A
Token TU1
Create Group B
Token TG1
Add User A to Group B (tokens TU1, TG1)
Client
Create User A
Token TU1
Create Group B
Token TG1
Add User A to Group B (tokens TU1, TG1)
Key takeaways
Key takeaways
Start small and challenge everything!
Key takeaways
Start small and challenge everything!
Incremental architecture for incremental demos
Key takeaways
Start small and challenge everything!
Incremental architecture for incremental demos
Think Events as an API
Key takeaways
Start small and challenge everything!
Incremental architecture for incremental demos
Think Events as an API
Accept weaker transactions and eventual consistency
We should using
event sourcing more
than we do
Martin Fowler (very loosely paraphrased)
bitbucket.org/atlassianlabs/eventsrc