append only data stores

140
vs Append-only data stores onsdag 16 oktober 13

Upload: jan-kronquist

Post on 20-Aug-2015

1.805 views

Category:

Entertainment & Humor


0 download

TRANSCRIPT

Page 1: Append only data stores

vs

Append-only data stores

onsdag 16 oktober 13

Page 2: Append only data stores

What?

onsdag 16 oktober 13

Page 3: Append only data stores

Append-only data stores

Only add, never remove or change

Can retrieve old values

onsdag 16 oktober 13

Page 4: Append only data stores

Source code

Version controlled

Keep all versions

onsdag 16 oktober 13

Page 5: Append only data stores

The problem

onsdag 16 oktober 13

Page 6: Append only data stores

Mutable state

id name email

jakr Jan Kronquist [email protected]

onsdag 16 oktober 13

Page 7: Append only data stores

Mutable state

id name email

jakr Jan Kronquist [email protected]

UPDATE customerSET email="[email protected]"WHERE id="jakr"

onsdag 16 oktober 13

Page 8: Append only data stores

Mutable state

id name email

jakr Jan Kronquist [email protected]

UPDATE customerSET email="[email protected]"WHERE id="jakr"

onsdag 16 oktober 13

Page 9: Append only data stores

Mutable state

id name email

jakr Jan Kronquist [email protected]

UPDATE customerSET email="[email protected]"WHERE id="jakr"

I didn’t get confirmation of the order last week?

onsdag 16 oktober 13

Page 10: Append only data stores

Mutable state

id name email

jakr Jan Kronquist [email protected]

UPDATE customerSET email="[email protected]"WHERE id="jakr"

I didn’t get confirmation of the order last week?

Could you reset my email address?

onsdag 16 oktober 13

Page 11: Append only data stores

The technical details

SELECT count(*) AS inSwedenFROM customerWHERE email LIKE "%@jayway.se"

SELECT count(*) AS elsewhereFROM customerWHERE email LIKE "%@jayway.com"

total = inSweden + elsewhere

onsdag 16 oktober 13

Page 12: Append only data stores

Human errors

DELETEFROM customerWHERE email LIKE "j%"

onsdag 16 oktober 13

Page 13: Append only data stores

Scalability - the easy parts

Static content

Caching

onsdag 16 oktober 13

Page 14: Append only data stores

Scalability - the easy parts

Static content

Caching

onsdag 16 oktober 13

Page 15: Append only data stores

Scalability - the easy parts

Static content

Stateless work

Caching

onsdag 16 oktober 13

Page 16: Append only data stores

Scalability - the easy parts

Static content

Stateless work

Load balancer

Caching

onsdag 16 oktober 13

Page 17: Append only data stores

State + behavior

Scalability - the hard parts

onsdag 16 oktober 13

Page 18: Append only data stores

State + behavior

Scalability - the hard parts

onsdag 16 oktober 13

Page 19: Append only data stores

Example domain

onsdag 16 oktober 13

Page 20: Append only data stores

Rock - Paper - Scissors

onsdag 16 oktober 13

Page 21: Append only data stores

http://rock-paper-scissors.com/

The future Facebook of Rock Paper Scissors

Millions of users

Many games per user

onsdag 16 oktober 13

Page 22: Append only data stores

Playing the game

Player A

Player B

Server

onsdag 16 oktober 13

Page 23: Append only data stores

Playing the game

Player A

Player B

Server

Game 123

onsdag 16 oktober 13

Page 24: Append only data stores

Playing the game

Player A

Player B

Serverpaper

Game 123

onsdag 16 oktober 13

Page 25: Append only data stores

Playing the game

Player A

Player B

Serverpaper

Player B: paper

Game 123

onsdag 16 oktober 13

Page 26: Append only data stores

Playing the game

Player A

Player B

Server

rock

Player B: paper

Player A: rock

Game 123

onsdag 16 oktober 13

Page 27: Append only data stores

Playing the game

Player A

Player B

Server

Player B: paper

Player A: rock

Game 123

Game 123winner: Player Bloser: Player A

onsdag 16 oktober 13

Page 28: Append only data stores

Playing the game

Player A

Player B

Server

Player B: paper

Player A: rock

Game 123

Game 123winner: Player Bloser: Player A

CREATED WAITING

GAME WON

GAME TIED

any move

other move(victory)

other move(tie)

onsdag 16 oktober 13

Page 29: Append only data stores

Entities

onsdag 16 oktober 13

Page 30: Append only data stores

Entities

Player+ id+ name+ email

onsdag 16 oktober 13

Page 31: Append only data stores

Entities

Game+ id+ state+ players+ moves+ winner+ loser

Player+ id+ name+ email

onsdag 16 oktober 13

Page 32: Append only data stores

Entities

Game+ id+ state+ players+ moves+ winner+ loser Move

+ move+ player

Player+ id+ name+ email

onsdag 16 oktober 13

Page 33: Append only data stores

Actions

Create game

Make move

Get game result

POST /games

POST /games/123 move=rock

GET /games/123

onsdag 16 oktober 13

Page 34: Append only data stores

Actions

Create game

Make move

Get game result

POST /games

POST /games/123 move=rock

GET /games/123

1. Form (make move)

2. Waiting

3. Game result

4. Error

onsdag 16 oktober 13

Page 35: Append only data stores

Clojure

onsdag 16 oktober 13

Page 36: Append only data stores

Clojure data structures

onsdag 16 oktober 13

Page 37: Append only data stores

Clojure data structures

Lists - singly linked(1 2 3 4 5) (fred ethel lucy) (list 1 2 3)

onsdag 16 oktober 13

Page 38: Append only data stores

Clojure data structures

Lists - singly linked(1 2 3 4 5) (fred ethel lucy) (list 1 2 3)

Vectors - indexed access[1 2 3] ["fred" 17 3.14 "bar"]

onsdag 16 oktober 13

Page 39: Append only data stores

Clojure data structures

Lists - singly linked(1 2 3 4 5) (fred ethel lucy) (list 1 2 3)

Vectors - indexed access[1 2 3] ["fred" 17 3.14 "bar"]

Maps{:name "Jan Kronquist" :age 37}

onsdag 16 oktober 13

Page 40: Append only data stores

Event Sourcingwith

Event Store

onsdag 16 oktober 13

Page 41: Append only data stores

Event Sourcing

Events that have happened

Ordered in time

Source of truth

onsdag 16 oktober 13

Page 42: Append only data stores

http://geteventstore.com

Runs on .NET and Mono

Free (store) or Commercial (HA)

APICustom TCP (c#)

ATOM over HTTP (xml/json)

FeaturesEvent streams, projections, generate new events (CEP)

€1500/year

onsdag 16 oktober 13

Page 43: Append only data stores

Event example

Server EventStore

onsdag 16 oktober 13

Page 44: Append only data stores

Event example

Server

CreateGameCommand{:game 123 :creator "player-1"}

EventStore

onsdag 16 oktober 13

Page 45: Append only data stores

Event example

Server

CreateGameCommand{:game 123 :creator "player-1"}

GameCreatedEvent{:game 123 :creator "player-1"}

EventStore

onsdag 16 oktober 13

Page 46: Append only data stores

Event example

Server

MakeMoveCommand{:game 123 :player "player-1" :move "rock"}

GameCreatedEvent{:game 123 :creator "player-1"}

MoveMadeEvent{:game 123 :player "player-1" :move "rock"}

EventStore

onsdag 16 oktober 13

Page 47: Append only data stores

Event example

Server

MakeMoveCommand{:game 123 :player "player-2" :move "paper"}

GameCreatedEvent{:game 123 :creator "player-1"}

MoveMadeEvent{:game 123 :player "player-1" :move "rock"}

MoveMadeEvent{:game 123 :player "player-2" :move "paper"}GameWonEvent{:game 123 :winner "player-2" :loser "player-1"}

EventStore

onsdag 16 oktober 13

Page 48: Append only data stores

GameCreatedEvent{:game 123, :creator "player-1", :time 1} MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

Current state?

onsdag 16 oktober 13

Page 49: Append only data stores

CREATED WAITING

GAME WON

GAME TIED

any move

if victory

other move

if tie

GameCreatedEvent{:game 123, :creator "player-1", :time 1} MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

Current state?

onsdag 16 oktober 13

Page 50: Append only data stores

CREATED WAITING

GAME WON

GAME TIED

any move

if victory

other move

if tie

GameCreatedEvent{:game 123, :creator "player-1", :time 1} MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}GameCreatedEvent

Current state?

CREATED

onsdag 16 oktober 13

Page 51: Append only data stores

CREATED WAITING

GAME WON

GAME TIED

any move

if victory

other move

if tie

GameCreatedEvent{:game 123, :creator "player-1", :time 1} MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

Current state?

WAITING

MoveMadeEvent

onsdag 16 oktober 13

Page 52: Append only data stores

Aggregates

Scope of consistency when handling a command

Game+ id+ state+ players+ moves+ winner+ loser

Move+ id+ move+ player

Player+ id+ name+ email

onsdag 16 oktober 13

Page 53: Append only data stores

Aggregates as Event Streams

event1 GameCreatedEvent{:game 1...}event2 MoveMadeEvent{:game 1....}

stream = game-1version = 2

onsdag 16 oktober 13

Page 54: Append only data stores

Aggregates as Event Streams

event1 GameCreatedEvent{:game 1...}event2 MoveMadeEvent{:game 1....}

stream = game-1version = 2

event1 GameCreatedEvent{:game 2...}event2 MoveMadeEvent{:game 2....}event3 MoveMadeEvent{:game 2....}event4 GameWonEvent{:game 2....}

stream = game-2version = 4

onsdag 16 oktober 13

Page 55: Append only data stores

Aggregates as Event Streams

event1 GameCreatedEvent{:game 1...}event2 MoveMadeEvent{:game 1....}

stream = game-1version = 2

event1 GameCreatedEvent{:game 2...}event2 MoveMadeEvent{:game 2....}event3 MoveMadeEvent{:game 2....}event4 GameWonEvent{:game 2....}

stream = game-2version = 4

curl "http://127.0.0.1:2113/streams/game-1" -d @eventdata.json -H "Content-Type:application/json" -H "ES-ExpectedVersion: 2"

onsdag 16 oktober 13

Page 56: Append only data stores

Projections

GameCreatedEvent{:game 1...}MoveMadeEvent{:game 1....}GameCreatedEvent{:game 2...}MoveMadeEvent{:game 2....}MoveMadeEvent{:game 2....}GameWonEvent{:game 2....}

onsdag 16 oktober 13

Page 57: Append only data stores

Projections

GameCreatedEvent{:game 1...}MoveMadeEvent{:game 1....}GameCreatedEvent{:game 2...}MoveMadeEvent{:game 2....}MoveMadeEvent{:game 2....}GameWonEvent{:game 2....}

for (Event events : allEvents) { if (event instanceof GameCreatedEvent) { created++; }}return created;

onsdag 16 oktober 13

Page 58: Append only data stores

Projections

GameCreatedEvent{:game 1...}MoveMadeEvent{:game 1....}GameCreatedEvent{:game 2...}MoveMadeEvent{:game 2....}MoveMadeEvent{:game 2....}GameWonEvent{:game 2....}

onsdag 16 oktober 13

Page 59: Append only data stores

Projections

GameCreatedEvent{:game 1...}MoveMadeEvent{:game 1....}GameCreatedEvent{:game 2...}MoveMadeEvent{:game 2....}MoveMadeEvent{:game 2....}GameWonEvent{:game 2....} created = 2

onsdag 16 oktober 13

Page 60: Append only data stores

Projections

GameCreatedEvent{:game 1...}MoveMadeEvent{:game 1....}GameCreatedEvent{:game 2...}MoveMadeEvent{:game 2....}MoveMadeEvent{:game 2....}GameWonEvent{:game 2....} created = 2GameCreatedEvent{:game 3...}

onsdag 16 oktober 13

Page 61: Append only data stores

Projections

GameCreatedEvent{:game 1...}MoveMadeEvent{:game 1....}GameCreatedEvent{:game 2...}MoveMadeEvent{:game 2....}MoveMadeEvent{:game 2....}GameWonEvent{:game 2....}

(state, event) -> { if (event instanceof GameCreatedEvent) { return state++; } rerturn state;}

created = 2GameCreatedEvent{:game 3...}

onsdag 16 oktober 13

Page 62: Append only data stores

Projections in JavascriptfromAll().when({ $init: function () { return { created: 0, completed:0 }; },

});

onsdag 16 oktober 13

Page 63: Append only data stores

Projections in JavascriptfromAll().when({ $init: function () { return { created: 0, completed:0 }; },

});

GameCreatedEvent: function(s, e) { s.created++; return s; },

onsdag 16 oktober 13

Page 64: Append only data stores

Projections in JavascriptfromAll().when({ $init: function () { return { created: 0, completed:0 }; },

});

GameCreatedEvent: function(s, e) { s.created++; return s; },

GameWonEvent: function(s, e) { s.completed++; return s; },

onsdag 16 oktober 13

Page 65: Append only data stores

Projections in JavascriptfromAll().when({ $init: function () { return { created: 0, completed:0 }; },

});

GameCreatedEvent: function(s, e) { s.created++; return s; },

GameWonEvent: function(s, e) { s.completed++; return s; },

GameTiedEvent: function(s, e) { s.completed++; return s; }

onsdag 16 oktober 13

Page 66: Append only data stores

Projections in JavascriptfromAll().when({ $init: function () { return { created: 0, completed:0 }; },

});

GameCreatedEvent: function(s, e) { s.created++; return s; },

GameWonEvent: function(s, e) { s.completed++; return s; },

GameTiedEvent: function(s, e) { s.completed++; return s; }

/projections/games-counter{created: 15,completed: 10

}

onsdag 16 oktober 13

Page 67: Append only data stores

External Projections

events

Business logic

onsdag 16 oktober 13

Page 68: Append only data stores

External Projections

events events

Business logic Projections

onsdag 16 oktober 13

Page 69: Append only data stores

External Projections

Consistent

Available

events events

Business logic Projections

onsdag 16 oktober 13

Page 70: Append only data stores

External Projections

Commands Queries

Consistent

Available

events events

onsdag 16 oktober 13

Page 71: Append only data stores

System with EventStore

onsdag 16 oktober 13

Page 72: Append only data stores

System with EventStore

Command Handler

onsdag 16 oktober 13

Page 73: Append only data stores

System with EventStore

1.command Command Handler

onsdag 16 oktober 13

Page 74: Append only data stores

System with EventStore

1.command Event Store

Command Handler

2.get events

onsdag 16 oktober 13

Page 75: Append only data stores

System with EventStore

1.command Event Store

Command Handler

2.get events

3.add events

onsdag 16 oktober 13

Page 76: Append only data stores

System with EventStore

1.command Event Store

Command Handler

2.get events

3.add events

4.updateprojections

onsdag 16 oktober 13

Page 77: Append only data stores

System with EventStore

1.command Event Store

Command Handler

2.get events

3.add events

4.updateprojections

5.get eventsor projections

Some service

onsdag 16 oktober 13

Page 78: Append only data stores

System with EventStore

1.command Event Store

Command Handler

2.get events

6.update state

3.add events

4.updateprojections

5.get eventsor projections

Some service

onsdag 16 oktober 13

Page 79: Append only data stores

System with EventStore

1.command Event Store

Command Handler

2.get events

6.update state

3.add events

4.updateprojections

7.query

5.get eventsor projections

Some service

onsdag 16 oktober 13

Page 80: Append only data stores

More info

Functional Programming with DDDhttp://skillsmatter.com/podcast/design-architecture/ddd-functional-programming

A deep look into the Event Storehttp://vimeo.com/53153270

onsdag 16 oktober 13

Page 81: Append only data stores

Datomic

onsdag 16 oktober 13

Page 82: Append only data stores

http://www.datomic.com/

Runs on JVM

Free (3 peers, local storage) or Commercial (HA, distrib)

FeaturesACID transactions, declarative query engine

€2300

onsdag 16 oktober 13

Page 83: Append only data stores

Fact

Something known to have happened or existed

onsdag 16 oktober 13

Page 84: Append only data stores

Fact

Something known to have happened or existed

2004-10-01 the email of Jan was ”[email protected]

onsdag 16 oktober 13

Page 85: Append only data stores

Fact

Something known to have happened or existed

2004-10-01 the email of Jan was ”[email protected]

2007-01-01 the email of Jan was ”[email protected]

onsdag 16 oktober 13

Page 86: Append only data stores

Atomic fact (datom)

Entity

Attribute

Value

Time

onsdag 16 oktober 13

Page 87: Append only data stores

Atomic fact (datom)

Entity

Attribute

Value

Time

The person Jan Kronquist

email

[email protected]

2004-10-01

onsdag 16 oktober 13

Page 88: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

onsdag 16 oktober 13

Page 89: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

onsdag 16 oktober 13

Page 90: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 16 oktober 13

Page 91: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

query

onsdag 16 oktober 13

Page 92: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 16 oktober 13

Page 93: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 16 oktober 13

Page 94: Append only data stores

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 16 oktober 13

Page 95: Append only data stores

Database deconstructed

onsdag 16 oktober 13

Page 96: Append only data stores

Database deconstructed

TransactorConsistency by serializing transactions

onsdag 16 oktober 13

Page 97: Append only data stores

Database deconstructed

TransactorConsistency by serializing transactions

PeerYour code + Query engine

onsdag 16 oktober 13

Page 98: Append only data stores

Database deconstructed

TransactorConsistency by serializing transactions

PeerYour code + Query engine

Storage serviceKey/value store

Scalable reads and writes

eg DynamoDB, InfiniSpan, Riak + ZooKeeper, SQL(!)

onsdag 16 oktober 13

Page 99: Append only data stores

System with Datomic

Transactor

Distributed Storage Service

Peer A Peer A

onsdag 16 oktober 13

Page 100: Append only data stores

System with Datomic

Transactor

Distributed Storage Service

Peer A Peer A

1.command

onsdag 16 oktober 13

Page 101: Append only data stores

System with Datomic

Transactor

Distributed Storage Service

Peer A Peer A

2.read and cache

1.command

onsdag 16 oktober 13

Page 102: Append only data stores

System with Datomic

Transactor

Distributed Storage Service

Peer A

3.transact

Peer A

2.read and cache

1.command

onsdag 16 oktober 13

Page 103: Append only data stores

System with Datomic

Transactor

Distributed Storage Service

Peer A

3.transact

Peer A

4.write

2.read and cache

1.command

onsdag 16 oktober 13

Page 104: Append only data stores

System with Datomic

Transactor

Distributed Storage Service

Peer A

3.transact

Peer A

4.write

2.read and cache

Peer B

5.notify

1.command

onsdag 16 oktober 13

Page 105: Append only data stores

Datomic example

Peer Transactor

onsdag 16 oktober 13

Page 106: Append only data stores

Datomic example

Peer

CreateGameCommand{:game 123 :creator "player-1"}

Transactor

onsdag 16 oktober 13

Page 107: Append only data stores

Datomic example

Peer

CreateGameCommand{:game 123 :creator "player-1"}

[123 :creator "player-1" T1][123 :state :created T1]

Transactor

onsdag 16 oktober 13

Page 108: Append only data stores

Datomic example

Peer

CreateGameCommand{:game 123 :creator "player-1"}

[123 :creator "player-1" T1][123 :state :created T1]

Transactor

["player-1" :email "[email protected]" T0]

onsdag 16 oktober 13

Page 109: Append only data stores

Datomic example

Peer

CreateGameCommand{:game 123 :creator "player-1"}

[123 :creator "player-1" T1][123 :state :created T1]

Transactor

onsdag 16 oktober 13

Page 110: Append only data stores

Datomic example

Peer

CreateGameCommand{:game 123 :creator "player-1"}

[123 :creator "player-1" T1][123 :state :created T1]

Transactor

GameCreatedEvent{:game 123 :creator "player-1"}

onsdag 16 oktober 13

Page 111: Append only data stores

Datomic example

Peer

CreateGameCommand{:game 123 :creator "player-1"}

[123 :creator "player-1" T1][123 :state :created T1]

Transactor

onsdag 16 oktober 13

Page 112: Append only data stores

Datomic example

Peer

MakeMoveCommand{:game 123 :player "player-1" :move :rock}

[123 :creator "player-1" T1][123 :state :created T1][123_1 :move :rock T2][123_1 :player "player-1" T2][123 :moves 123_1 T2][123 :state :waiting T2]

Transactor

onsdag 16 oktober 13

Page 113: Append only data stores

Datomic example

Peer

MakeMoveCommand{:game 123 :player "player-2" :move :paper}

[123 :creator "player-1" T1][123 :state :created T1][123_1 :move :rock T2][123_1 :player "player-1" T2][123 :moves 123_1 T2][123 :state :waiting T2][123_2 :move :paper T3][123_2 :player "player-2" T3][123 :moves 123_2 T3][123 :state :won T3][123 :winner "player-2" T3][123 :loser "player-1" T3]

Transactor

onsdag 16 oktober 13

Page 114: Append only data stores

Aggregates?

Only by convention

cas (compare and set)

isComponent on relation

Game+ id+ state+ players+ moves+ winner+ loser

Move+ id+ move+ player

onsdag 16 oktober 13

Page 115: Append only data stores

What to find

Where clauses [entity attribute value]

Implicit joins

Call arbitrary function

Query language

onsdag 16 oktober 13

Page 116: Append only data stores

Query example - basic

[:find ?email :where [_ :email ?email]]

onsdag 16 oktober 13

Page 117: Append only data stores

Query example - basic

[:find ?email :where [_ :email ?email]]

[["[email protected]] ["[email protected]"] ["[email protected]"]]

onsdag 16 oktober 13

Page 118: Append only data stores

Query example - aggregation

[:find ?state (?count game) :where [?game :state ?state]]

onsdag 16 oktober 13

Page 119: Append only data stores

Query example - aggregation

[:find ?state (?count game) :where [?game :state ?state]]

[[:created 4] [:waiting 1] [:won 7] [:tied 3]]

onsdag 16 oktober 13

Page 120: Append only data stores

Query example - aggregation

[:find ?state (?count game) :where [?game :state ?state]]

[[:created 4] [:waiting 1] [:won 7] [:tied 3]]

inProgess = created + waiting

onsdag 16 oktober 13

Page 121: Append only data stores

Query example - aggregation

[:find ?state (?count game) :where [?game :state ?state]]

[[:created 4] [:waiting 1] [:won 7] [:tied 3]]

inProgess = created + waiting

fromAll().when({ $init: function () { return { created: 0, completed:0 }; },

GameCreatedEvent: function(s, e) { s.created++; return s; },

GameWonEvent: function(s, e) { s.completed++; return s; },

GameTiedEvent: function(s, e) { s.completed++; return s; }});

/projections/games-counter{

created: 15,completed: 10

}

onsdag 16 oktober 13

Page 122: Append only data stores

Query example - join

[:find ?email (count ?game) :where [?player :email ?email] [?game :winner ?player]]

onsdag 16 oktober 13

Page 123: Append only data stores

Query at any time

(q ’[:find ?email :where [_ :email ?email]] db)

onsdag 16 oktober 13

Page 124: Append only data stores

Query at any time

(q ’[:find ?email :where [_ :email ?email]] db)

(q ’[:find ?email :where [_ :email ?email]] (as-of db #inst "2013-09-02"))

onsdag 16 oktober 13

Page 125: Append only data stores

Query over time

(q ’[:find ?e (count ?tx) :where [?e :email _ ?tx]] db)

onsdag 16 oktober 13

Page 126: Append only data stores

Query over time

(q ’[:find ?e (count ?tx) :where [?e :email _ ?tx]] db)

(q ’[:find ?e (count ?tx) :where [?e :email _ ?tx]] (history db))

onsdag 16 oktober 13

Page 127: Append only data stores

Java API

List<Object> results = Peer.q(someQuery, conn.db());

Future<Map> txResult = conn.transact(data_tx);

onsdag 16 oktober 13

Page 128: Append only data stores

More info

http://www.datomic.com/videos.html

onsdag 16 oktober 13

Page 129: Append only data stores

Comparison

onsdag 16 oktober 13

Page 130: Append only data stores

Comparison

Data model

Schema evolution

Queries

Recommendation

onsdag 16 oktober 13

Page 131: Append only data stores

EventStore Events

✓ Understandable by normal people

✓ Designed for integration

✓ Forces aggregate design (scalability)

✓ Capture intent

๏ Require design effort to get right

๏ Complect transaction and query

onsdag 16 oktober 13

Page 132: Append only data stores

Datomic Facts

✓ Support partial information

✓ Normalization support

✓ CRUD out of the box

๏ Static schema

onsdag 16 oktober 13

Page 133: Append only data stores

✓ New events

✓ New event attributes

✓ Event attributes rename (change deserialization)

✓ Projected state change (rebuild projection)

๏ Cross event refactoring

EventStore schema evolution

onsdag 16 oktober 13

Page 134: Append only data stores

✓ New or removed attributes

✓ New or removed entity types

✓Move attributes between entities

๏ Fact attributes rename not possible

๏ Fact attribute type change not possible

Datomic schema evolution

onsdag 16 oktober 13

Page 135: Append only data stores

✓ Projections use JavaScript

✓ Persistent

๏ Require projection

EventStore queries

onsdag 16 oktober 13

Page 136: Append only data stores

✓ Declarative

✓ Logic-based

✓ Allows calling out to your own code

๏ New language to learn

Datomic queries

onsdag 16 oktober 13

Page 137: Append only data stores

When to use Event Sourcing?

Domains where events seem natural

Different teams with different models

onsdag 16 oktober 13

Page 138: Append only data stores

When to use Datomic?

Data can be modelled using entities and attributes

History is or may be interesting

onsdag 16 oktober 13

Page 139: Append only data stores

More details

http://www.jayway.com/author/jankronquist/

https://github.com/jankronquist

http://www.slideshare.net/jankronquist

onsdag 16 oktober 13

Page 140: Append only data stores

Questions?

onsdag 16 oktober 13