Transcript
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


Top Related