JavaZone 2013 - Datomic vs EventStore

119
vs Immutable data stores onsdag 25 september 13

description

If you are used to traditional databases, then to only append and never update your data may sound like a crazy idea. However, not only does this enable historical queries, but also enhances fault tolerance and scalability. In this presentation we briefly describe two immutable data stores (Rich Hickey's Datomic and Greg Young's EventStore) and compare their different data models using an example problem domain. Along the way we learn about CQRS, Aggregates, Projections and why you want your data to be immutable. EventStore is a data store for applications using event sourcing and time-series data. EventStore runs on .NET and Mono. Datomic is a database of time-based facts, with declarative queries and ACID transactions. Datomic is written in Clojure and runs on the JVM.

Transcript of JavaZone 2013 - Datomic vs EventStore

Page 1: JavaZone 2013 - Datomic vs EventStore

vs

Immutable data stores

onsdag 25 september 13

Page 2: JavaZone 2013 - Datomic vs EventStore

What?

onsdag 25 september 13

Page 3: JavaZone 2013 - Datomic vs EventStore

Immutable data stores

Only add, never remove or change

Can retrieve old values

onsdag 25 september 13

Page 4: JavaZone 2013 - Datomic vs EventStore

Source code

Version controlled

Keep all versions

onsdag 25 september 13

Page 5: JavaZone 2013 - Datomic vs EventStore

Example domain

onsdag 25 september 13

Page 6: JavaZone 2013 - Datomic vs EventStore

Rock - Paper - Scissors

onsdag 25 september 13

Page 7: JavaZone 2013 - Datomic vs EventStore

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

The future Facebook of Rock Paper Scissors

Millions of users

Many games per user

onsdag 25 september 13

Page 8: JavaZone 2013 - Datomic vs EventStore

Playing the game

Player A

Player B

Server

onsdag 25 september 13

Page 9: JavaZone 2013 - Datomic vs EventStore

Playing the game

Player A

Player B

Server

Game 123

onsdag 25 september 13

Page 10: JavaZone 2013 - Datomic vs EventStore

Playing the game

Player A

Player B

Serverpaper

Game 123

onsdag 25 september 13

Page 11: JavaZone 2013 - Datomic vs EventStore

Playing the game

Player A

Player B

Serverpaper

Player B: paper

Game 123

onsdag 25 september 13

Page 12: JavaZone 2013 - Datomic vs EventStore

Playing the game

Player A

Player B

Server

rock

Player B: paper

Player A: rock

Game 123

onsdag 25 september 13

Page 13: JavaZone 2013 - Datomic vs EventStore

Playing the game

Player A

Player B

Server

Player B: paper

Player A: rock

Game 123

Game 123winner: Player Bloser: Player A

onsdag 25 september 13

Page 14: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 15: JavaZone 2013 - Datomic vs EventStore

Entities

onsdag 25 september 13

Page 16: JavaZone 2013 - Datomic vs EventStore

Entities

Player+ id+ name+ email

onsdag 25 september 13

Page 17: JavaZone 2013 - Datomic vs EventStore

Entities

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

Player+ id+ name+ email

onsdag 25 september 13

Page 18: JavaZone 2013 - Datomic vs EventStore

Entities

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

+ move+ player

Player+ id+ name+ email

onsdag 25 september 13

Page 19: JavaZone 2013 - Datomic vs EventStore

Actions

Create game

Make move

Get game result

POST /games

POST /games/123 move=rock

GET /games/123

onsdag 25 september 13

Page 20: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 21: JavaZone 2013 - Datomic vs EventStore

Event Sourcingwith

Event Store

onsdag 25 september 13

Page 22: JavaZone 2013 - Datomic vs EventStore

Event Sourcing

Events that have happened

Ordered in time

Source of truth

onsdag 25 september 13

Page 23: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 24: JavaZone 2013 - Datomic vs EventStore

Event example

Server EventStore

onsdag 25 september 13

Page 25: JavaZone 2013 - Datomic vs EventStore

Event example

Server

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

EventStore

onsdag 25 september 13

Page 26: JavaZone 2013 - Datomic vs EventStore

Event example

Server

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

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

EventStore

onsdag 25 september 13

Page 27: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 28: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 29: JavaZone 2013 - Datomic vs EventStore

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

Current state?

onsdag 25 september 13

Page 30: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 31: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 32: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 33: JavaZone 2013 - Datomic vs EventStore

Aggregates

Scope of consistency when handling a command

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

Move+ id+ move+ player

Player+ id+ name+ email

onsdag 25 september 13

Page 34: JavaZone 2013 - Datomic vs EventStore

Aggregates as Event Streams

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

stream = game-1version = 2

onsdag 25 september 13

Page 35: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 36: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 37: JavaZone 2013 - Datomic vs EventStore

Projections

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

onsdag 25 september 13

Page 38: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 39: JavaZone 2013 - Datomic vs EventStore

Projections

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

onsdag 25 september 13

Page 40: JavaZone 2013 - Datomic vs EventStore

Projections

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

onsdag 25 september 13

Page 41: JavaZone 2013 - Datomic vs EventStore

Projections

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

onsdag 25 september 13

Page 42: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 43: JavaZone 2013 - Datomic vs EventStore

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

});

onsdag 25 september 13

Page 44: JavaZone 2013 - Datomic vs EventStore

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

});

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

onsdag 25 september 13

Page 45: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 46: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 47: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 48: JavaZone 2013 - Datomic vs EventStore

External Projections

events

Business logic

onsdag 25 september 13

Page 49: JavaZone 2013 - Datomic vs EventStore

External Projections

events events

Business logic Projections

onsdag 25 september 13

Page 50: JavaZone 2013 - Datomic vs EventStore

External Projections

Consistent

Available

events events

Business logic Projections

onsdag 25 september 13

Page 51: JavaZone 2013 - Datomic vs EventStore

External Projections

Commands Queries

Consistent

Available

events events

onsdag 25 september 13

Page 52: JavaZone 2013 - Datomic vs EventStore

System with EventStore

onsdag 25 september 13

Page 53: JavaZone 2013 - Datomic vs EventStore

System with EventStore

Command Handler

onsdag 25 september 13

Page 54: JavaZone 2013 - Datomic vs EventStore

System with EventStore

1.command Command Handler

onsdag 25 september 13

Page 55: JavaZone 2013 - Datomic vs EventStore

System with EventStore

1.command Event Store

Command Handler

2.get events

onsdag 25 september 13

Page 56: JavaZone 2013 - Datomic vs EventStore

System with EventStore

1.command Event Store

Command Handler

2.get events

3.add events

onsdag 25 september 13

Page 57: JavaZone 2013 - Datomic vs EventStore

System with EventStore

1.command Event Store

Command Handler

2.get events

3.add events

4.updateprojections

onsdag 25 september 13

Page 58: JavaZone 2013 - Datomic vs EventStore

System with EventStore

1.command Event Store

Command Handler

2.get events

3.add events

4.updateprojections

5.get eventsor projections

Some service

onsdag 25 september 13

Page 59: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 60: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 61: JavaZone 2013 - Datomic vs EventStore

Datomic

onsdag 25 september 13

Page 62: JavaZone 2013 - Datomic vs EventStore

http://www.datomic.com/

Runs on JVM

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

FeaturesACID transactions, declarative query engine

€2300

onsdag 25 september 13

Page 63: JavaZone 2013 - Datomic vs EventStore

Fact

Something known to have happened or existed

onsdag 25 september 13

Page 64: JavaZone 2013 - Datomic vs EventStore

Fact

Something known to have happened or existed

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

onsdag 25 september 13

Page 65: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 66: JavaZone 2013 - Datomic vs EventStore

Atomic fact (datom)

Entity

Attribute

Value

Time

onsdag 25 september 13

Page 67: JavaZone 2013 - Datomic vs EventStore

Atomic fact (datom)

Entity

Attribute

Value

Time

The person Jan Kronquist

email

[email protected]

2004-10-01

onsdag 25 september 13

Page 68: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

onsdag 25 september 13

Page 69: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

onsdag 25 september 13

Page 70: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 25 september 13

Page 71: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

query

onsdag 25 september 13

Page 72: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 25 september 13

Page 73: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 25 september 13

Page 74: JavaZone 2013 - Datomic vs EventStore

Data perception

Facts

Add facts

Add more facts

Even more facts

time

query

onsdag 25 september 13

Page 75: JavaZone 2013 - Datomic vs EventStore

Database deconstructed

onsdag 25 september 13

Page 76: JavaZone 2013 - Datomic vs EventStore

Database deconstructed

TransactorConsistency by serializing transactions

onsdag 25 september 13

Page 77: JavaZone 2013 - Datomic vs EventStore

Database deconstructed

TransactorConsistency by serializing transactions

PeerYour code + Query engine

onsdag 25 september 13

Page 78: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 79: JavaZone 2013 - Datomic vs EventStore

System with Datomic

Transactor

Distributed Storage Service

Peer A Peer A

onsdag 25 september 13

Page 80: JavaZone 2013 - Datomic vs EventStore

System with Datomic

Transactor

Distributed Storage Service

Peer A Peer A

1.command

onsdag 25 september 13

Page 81: JavaZone 2013 - Datomic vs EventStore

System with Datomic

Transactor

Distributed Storage Service

Peer A Peer A

2.read and cache

1.command

onsdag 25 september 13

Page 82: JavaZone 2013 - Datomic vs EventStore

System with Datomic

Transactor

Distributed Storage Service

Peer A

3.transact

Peer A

2.read and cache

1.command

onsdag 25 september 13

Page 83: JavaZone 2013 - Datomic vs EventStore

System with Datomic

Transactor

Distributed Storage Service

Peer A

3.transact

Peer A

4.write

2.read and cache

1.command

onsdag 25 september 13

Page 84: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 85: JavaZone 2013 - Datomic vs EventStore

Datomic example

Peer Transactor

onsdag 25 september 13

Page 86: JavaZone 2013 - Datomic vs EventStore

Datomic example

Peer

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

Transactor

onsdag 25 september 13

Page 87: JavaZone 2013 - Datomic vs EventStore

Datomic example

Peer

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

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

Transactor

onsdag 25 september 13

Page 88: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 89: JavaZone 2013 - Datomic vs EventStore

Datomic example

Peer

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

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

Transactor

onsdag 25 september 13

Page 90: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 91: JavaZone 2013 - Datomic vs EventStore

Datomic example

Peer

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

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

Transactor

onsdag 25 september 13

Page 92: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 93: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 94: JavaZone 2013 - Datomic vs EventStore

Aggregates?

Only by convention

cas (compare and set)

isComponent on relation

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

Move+ id+ move+ player

onsdag 25 september 13

Page 95: JavaZone 2013 - Datomic vs EventStore

What to find

Where clauses [entity attribute value]

Implicit joins

Call arbitrary function

Query language

onsdag 25 september 13

Page 96: JavaZone 2013 - Datomic vs EventStore

Query example - basic

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

onsdag 25 september 13

Page 97: JavaZone 2013 - Datomic vs EventStore

Query example - basic

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

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

onsdag 25 september 13

Page 98: JavaZone 2013 - Datomic vs EventStore

Query example - aggregation

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

onsdag 25 september 13

Page 99: JavaZone 2013 - Datomic vs EventStore

Query example - aggregation

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

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

onsdag 25 september 13

Page 100: JavaZone 2013 - Datomic vs EventStore

Query example - aggregation

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

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

inProgess = created + waiting

onsdag 25 september 13

Page 101: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 102: JavaZone 2013 - Datomic vs EventStore

Query example - join

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

onsdag 25 september 13

Page 103: JavaZone 2013 - Datomic vs EventStore

Query at any time

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

onsdag 25 september 13

Page 104: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 105: JavaZone 2013 - Datomic vs EventStore

Query over time

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

onsdag 25 september 13

Page 106: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 107: JavaZone 2013 - Datomic vs EventStore

Java API

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

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

onsdag 25 september 13

Page 108: JavaZone 2013 - Datomic vs EventStore

Comparison

onsdag 25 september 13

Page 109: JavaZone 2013 - Datomic vs EventStore

Comparison

Data model

Schema evolution

Queries

Recommendation

onsdag 25 september 13

Page 110: JavaZone 2013 - Datomic vs EventStore

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 25 september 13

Page 111: JavaZone 2013 - Datomic vs EventStore

Datomic Facts

✓ Support partial information

✓ Normalization support

✓ CRUD out of the box

๏ Static schema

onsdag 25 september 13

Page 112: JavaZone 2013 - Datomic vs EventStore

✓ New events

✓ New event attributes

✓ Event attributes rename (change deserialization)

✓ Projected state change (rebuild projection)

๏ Cross event refactoring

EventStore schema evolution

onsdag 25 september 13

Page 113: JavaZone 2013 - Datomic vs EventStore

✓ 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 25 september 13

Page 114: JavaZone 2013 - Datomic vs EventStore

✓ Projections use JavaScript

✓ Persistent

๏ Require projection

EventStore queries

onsdag 25 september 13

Page 115: JavaZone 2013 - Datomic vs EventStore

✓ Declarative

✓ Logic-based

✓ Allows calling out to your own code

๏ New language to learn

Datomic queries

onsdag 25 september 13

Page 116: JavaZone 2013 - Datomic vs EventStore

When to use Event Sourcing?

Domains where events seem natural

Different teams with different models

onsdag 25 september 13

Page 117: JavaZone 2013 - Datomic vs EventStore

When to use Datomic?

Data can be modelled using entities and attributes

History is or may be interesting

onsdag 25 september 13

Page 118: JavaZone 2013 - Datomic vs EventStore

More details

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

https://github.com/jankronquist

onsdag 25 september 13

Page 119: JavaZone 2013 - Datomic vs EventStore

Questions?

onsdag 25 september 13