SlideShare a Scribd company logo
1 of 140
Download to read offline
Append-only data stores

vs

onsdag 16 oktober 13
What?

onsdag 16 oktober 13
Append-only data stores
Only add, never remove or change
Can retrieve old values

onsdag 16 oktober 13
Source code
Version controlled
Keep all versions

onsdag 16 oktober 13
The problem

onsdag 16 oktober 13
Mutable state

id

email

jakr

onsdag 16 oktober 13

name
Jan Kronquist

jan.kronquist@jayway.se
Mutable state

id

name

email

jakr

Jan Kronquist

jan.kronquist@jayway.se

UPDATE customer
SET email="jan.kronquist@jayway.com"
WHERE id="jakr"

onsdag 16 oktober 13
Mutable state

id

name

email

jakr

Jan Kronquist

jan.kronquist@jayway.com

UPDATE customer
SET email="jan.kronquist@jayway.com"
WHERE id="jakr"

onsdag 16 oktober 13
Mutable state

id

name

email

jakr

Jan Kronquist

jan.kronquist@jayway.com

UPDATE customer
SET email="jan.kronquist@jayway.com"
WHERE id="jakr"

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

onsdag 16 oktober 13
Mutable state

id

name

email

jakr

Jan Kronquist

jan.kronquist@jayway.com

UPDATE customer
SET email="jan.kronquist@jayway.com"
WHERE id="jakr"

I didn’t get confirmation of the order last week?
Could you reset my email address?

onsdag 16 oktober 13
The technical details

SELECT count(*) AS inSweden
FROM customer
WHERE email LIKE "%@jayway.se"

SELECT count(*) AS elsewhere
FROM customer
WHERE email LIKE "%@jayway.com"

total = inSweden + elsewhere

onsdag 16 oktober 13
Human errors

DELETE
FROM customer
WHERE email LIKE "j%"

onsdag 16 oktober 13
Scalability - the easy parts
Caching

Static content

onsdag 16 oktober 13
Scalability - the easy parts
Caching

Static content

onsdag 16 oktober 13
Scalability - the easy parts
Caching

Static content

Stateless work

onsdag 16 oktober 13
Scalability - the easy parts
Caching

Static content

Stateless work
Load balancer

onsdag 16 oktober 13
Scalability - the hard parts
State + behavior

onsdag 16 oktober 13
Scalability - the hard parts
State + behavior

onsdag 16 oktober 13
Example domain

onsdag 16 oktober 13
Rock - Paper - Scissors

onsdag 16 oktober 13
http://rock-paper-scissors.com/
The future Facebook of Rock Paper Scissors
Millions of users
Many games per user

onsdag 16 oktober 13
Playing the game

Player A

Player B
onsdag 16 oktober 13

Server
Playing the game

Player A

Server
Game 123

Player B
onsdag 16 oktober 13
Playing the game

Player A

paper

Server
Game 123

Player B
onsdag 16 oktober 13
Playing the game

Player A

paper

Server
Game 123
Player B: paper

Player B
onsdag 16 oktober 13
Playing the game

rock
Player A

Server
Game 123
Player B: paper
Player A: rock

Player B
onsdag 16 oktober 13
Playing the game

Player A

Game 123
winner: Player B
loser: Player A

Server
Game 123
Player B: paper
Player A: rock

Player B
onsdag 16 oktober 13
Playing the game
GAME WON
other move
(victory)

CREATED

WAITING
any move

other move
(tie)

GAME TIED

Player A

Game 123
winner: Player B
loser: Player A

Server
Game 123
Player B: paper
Player A: rock

Player B
onsdag 16 oktober 13
Entities

onsdag 16 oktober 13
Entities
Player
+ id
+ name
+ email

onsdag 16 oktober 13
Entities

+
+
+
+
+
+

onsdag 16 oktober 13

Game
id
state
players
moves
winner
loser

Player
+ id
+ name
+ email
Entities

+
+
+
+
+
+

onsdag 16 oktober 13

Game
id
state
players
moves
winner
loser

Player
+ id
+ name
+ email

Move
+ move
+ player
Actions
Create game

POST /games

Make move

POST /games/123
move=rock

Get game result

GET /games/123

onsdag 16 oktober 13
Actions
Create game

POST /games

Make move

POST /games/123
move=rock

Get game result

GET /games/123

1. Form (make move)
2. Waiting
3. Game result
4. Error

onsdag 16 oktober 13
Clojure

onsdag 16 oktober 13
Clojure data structures

onsdag 16 oktober 13
Clojure data structures
Lists - singly linked
(1 2 3 4 5) (fred ethel lucy) (list 1 2 3)

onsdag 16 oktober 13
Clojure data structures
Lists - singly linked
(1 2 3 4 5) (fred ethel lucy) (list 1 2 3)

Vectors - indexed access
[1 2 3]

onsdag 16 oktober 13

["fred" 17 3.14 "bar"]
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

onsdag 16 oktober 13

"Jan Kronquist" :age 37}
Event Sourcing
with
Event Store

onsdag 16 oktober 13
Event Sourcing
Events that have happened
Ordered in time
Source of truth

onsdag 16 oktober 13
http://geteventstore.com
Runs on .NET and Mono
Free (store) or Commercial (HA)
API

€1500/year

Custom TCP (c#)
ATOM over HTTP (xml/json)

Features
Event streams, projections, generate new events (CEP)

onsdag 16 oktober 13
Event example

Server

onsdag 16 oktober 13

EventStore
Event example
CreateGameCommand{:game 123 :creator "player-1"}

Server

onsdag 16 oktober 13

EventStore
Event example
CreateGameCommand{:game 123 :creator "player-1"}

Server

EventStore

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

onsdag 16 oktober 13
Event example
MakeMoveCommand{:game 123 :player "player-1" :move "rock"}

Server

EventStore

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

onsdag 16 oktober 13
Event example
MakeMoveCommand{:game 123 :player "player-2" :move "paper"}

Server

EventStore

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"}

onsdag 16 oktober 13
Current state?
GameCreatedEvent{:game 123, :creator "player-1", :time 1}
MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

onsdag 16 oktober 13
Current state?
GameCreatedEvent{:game 123, :creator "player-1", :time 1}
MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

GAME WON
if victory

CREATED

WAITING
any move

other move
if tie

GAME TIED

onsdag 16 oktober 13
Current state?
GameCreatedEvent
GameCreatedEvent{:game 123, :creator "player-1", :time 1}
MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

GAME WON
if victory

CREATED

WAITING
any move

other move
if tie

GAME TIED

onsdag 16 oktober 13
Current state?
GameCreatedEvent{:game 123, :creator "player-1", :time 1}
MoveMadeEvent
MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}

GAME WON
if victory

CREATED

WAITING
any move

other move
if tie

GAME TIED

onsdag 16 oktober 13
Aggregates
Scope of consistency when handling a command

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

onsdag 16 oktober 13

Move

Player

+ id

+ id

+ move

+ name

+ player

+ email
Aggregates as Event Streams

stream = game-1
version = 2

onsdag 16 oktober 13

event1 GameCreatedEvent{:game 1...}
event2 MoveMadeEvent{:game 1....}
Aggregates as Event Streams

stream = game-1
version = 2

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

stream = game-2
version = 4

event1
event2
event3
event4

onsdag 16 oktober 13

GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}
Aggregates as Event Streams

stream = game-1
version = 2

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

stream = game-2
version = 4

event1
event2
event3
event4

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

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
Projections
GameCreatedEvent{:game 1...}
MoveMadeEvent{:game 1....}
GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}

onsdag 16 oktober 13
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
Projections
GameCreatedEvent{:game 1...}
MoveMadeEvent{:game 1....}
GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}

onsdag 16 oktober 13
Projections
GameCreatedEvent{:game 1...}
MoveMadeEvent{:game 1....}
GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}

onsdag 16 oktober 13

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

onsdag 16 oktober 13
Projections
GameCreatedEvent{:game 1...}
MoveMadeEvent{:game 1....}
GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}
created = 2
GameCreatedEvent{:game 3...}

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

onsdag 16 oktober 13
Projections in Javascript
fromAll()
.when({
$init: function () {
return { created: 0, completed:0 };
},

});

onsdag 16 oktober 13
Projections in Javascript
fromAll()
.when({
$init: function () {
return { created: 0, completed:0 };
},
GameCreatedEvent: function(s, e) {
s.created++;
return s;
},

});

onsdag 16 oktober 13
Projections in Javascript
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;
},

});

onsdag 16 oktober 13
Projections in Javascript
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;
}
});

onsdag 16 oktober 13
Projections in Javascript
fromAll()
.when({
$init: function () {
return { created: 0, completed:0 };
},
GameCreatedEvent: function(s, e) {
s.created++;
return s;
},

});

onsdag 16 oktober 13

GameWonEvent: function(s, e) {
s.completed++;
return s;
},
/projections/games-counter
GameTiedEvent: function(s, e) {
{
s.completed++;
created: 15,
return s;
completed: 10
}
}
External Projections
Business logic

events

onsdag 16 oktober 13
External Projections
Business logic

Projections

events

onsdag 16 oktober 13

events
External Projections
Business logic

Projections

events

events

Available
Consistent

onsdag 16 oktober 13
External Projections
Commands

Queries

events

events

Available
Consistent

onsdag 16 oktober 13
System with EventStore

onsdag 16 oktober 13
System with EventStore

Command
Handler

onsdag 16 oktober 13
System with EventStore

1.command

onsdag 16 oktober 13

Command
Handler
System with EventStore

1.command

onsdag 16 oktober 13

Command
Handler

2.get events

Event
Store
System with EventStore

1.command

onsdag 16 oktober 13

Command
Handler

2.get events
3.add events

Event
Store
System with EventStore

1.command

onsdag 16 oktober 13

Command
Handler

2.get events
3.add events

4.update
projections

Event
Store
System with EventStore

1.command

Command
Handler

2.get events
3.add events

5.get events
or projections

Some
service

onsdag 16 oktober 13

4.update
projections

Event
Store
System with EventStore

1.command

Command
Handler

2.get events
3.add events

4.update
projections

Event
Store

5.get events
or projections

Some
service

onsdag 16 oktober 13

6.update state
System with EventStore

1.command

Command
Handler

2.get events
3.add events

4.update
projections

Event
Store

5.get events
or projections

7.query

onsdag 16 oktober 13

Some
service

6.update state
More info
Functional Programming with DDD
http://skillsmatter.com/podcast/design-architecture/ddd-functional-programming

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

onsdag 16 oktober 13
Datomic

onsdag 16 oktober 13
http://www.datomic.com/
Runs on JVM

€2300

Free (3 peers, local storage) or Commercial (HA, distrib)
Features
ACID transactions, declarative query engine

onsdag 16 oktober 13
Fact
Something known to have happened or existed

onsdag 16 oktober 13
Fact
Something known to have happened or existed

2004-10-01 the email of Jan was ”jan.kronquist@jayway.se”

onsdag 16 oktober 13
Fact
Something known to have happened or existed

2004-10-01 the email of Jan was ”jan.kronquist@jayway.se”
2007-01-01 the email of Jan was ”jan.kronquist@jayway.com”

onsdag 16 oktober 13
Atomic fact (datom)
Entity
Attribute
Value
Time

onsdag 16 oktober 13
Atomic fact (datom)
Entity

The person Jan Kronquist

Attribute

email

Value

”jan.kronquist@jayway.se”

Time

2004-10-01

onsdag 16 oktober 13
Data perception

Facts

Add facts
Add more facts
Even more facts

time
onsdag 16 oktober 13
Data perception

Facts

Add facts
Add more facts
Even more facts

time
onsdag 16 oktober 13
Data perception

Facts

query

Add facts
Add more facts
Even more facts

time
onsdag 16 oktober 13
Data perception

Facts

query

Add facts
Add more facts

query
Even more facts

time
onsdag 16 oktober 13
Data perception

Facts

Add facts
Add more facts

query
Even more facts

time
onsdag 16 oktober 13
Data perception

Facts

Add facts
Add more facts

query
Even more facts

time
onsdag 16 oktober 13
Data perception

Facts

Add facts
Add more facts

query
Even more facts

time
onsdag 16 oktober 13
Database deconstructed

onsdag 16 oktober 13
Database deconstructed
Transactor
Consistency by serializing transactions

onsdag 16 oktober 13
Database deconstructed
Transactor
Consistency by serializing transactions

Peer
Your code + Query engine

onsdag 16 oktober 13
Database deconstructed
Transactor
Consistency by serializing transactions

Peer
Your code + Query engine

Storage service
Key/value store
Scalable reads and writes
eg DynamoDB, InfiniSpan, Riak + ZooKeeper, SQL(!)

onsdag 16 oktober 13
System with Datomic
Peer A

Transactor

Distributed

onsdag 16 oktober 13

Storage

Service
System with Datomic
1.command

Peer A

Transactor

Distributed

onsdag 16 oktober 13

Storage

Service
System with Datomic
1.command

Peer A

2.read and cache

Transactor

Distributed

onsdag 16 oktober 13

Storage

Service
System with Datomic
1.command

Peer A
3.transact
2.read and cache

Transactor

Distributed

onsdag 16 oktober 13

Storage

Service
System with Datomic
1.command

Peer A
3.transact
2.read and cache

Transactor
4.write

Distributed

onsdag 16 oktober 13

Storage

Service
System with Datomic
1.command

Peer A
3.transact
2.read and cache

Transactor
4.write
5.notify

Peer B

onsdag 16 oktober 13

Distributed

Storage

Service
Datomic example

Peer

onsdag 16 oktober 13

Transactor
Datomic example
CreateGameCommand{:game 123 :creator "player-1"}

Peer

onsdag 16 oktober 13

Transactor
Datomic example
CreateGameCommand{:game 123 :creator "player-1"}

Transactor

Peer

[123
[123

onsdag 16 oktober 13

:creator
:state

"player-1"
:created

T1]
T1]
Datomic example
CreateGameCommand{:game 123 :creator "player-1"}

Transactor

Peer

[123
[123

:creator
:state

"player-1"
:created

["player-1" :email "player@gmail.com" T0]

onsdag 16 oktober 13

T1]
T1]
Datomic example
CreateGameCommand{:game 123 :creator "player-1"}

Transactor

Peer

[123
[123

onsdag 16 oktober 13

:creator
:state

"player-1"
:created

T1]
T1]
Datomic example
CreateGameCommand{:game 123 :creator "player-1"}

Transactor

Peer

[123
[123

:creator
:state

"player-1"
:created

T1]
T1]

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

onsdag 16 oktober 13
Datomic example
CreateGameCommand{:game 123 :creator "player-1"}

Transactor

Peer

[123
[123

onsdag 16 oktober 13

:creator
:state

"player-1"
:created

T1]
T1]
Datomic example
MakeMoveCommand{:game 123 :player "player-1" :move :rock}

Transactor

Peer

[123
[123
[123_1
[123_1
[123
[123

onsdag 16 oktober 13

:creator
:state
:move
:player
:moves
:state

"player-1"
:created
:rock
"player-1"
123_1
:waiting

T1]
T1]
T2]
T2]
T2]
T2]
Datomic example
MakeMoveCommand{:game 123 :player "player-2" :move :paper}

Transactor

Peer

[123
[123
[123_1
[123_1
[123
[123
[123_2
[123_2
[123
[123
[123
[123
onsdag 16 oktober 13

:creator
:state
:move
:player
:moves
:state
:move
:player
:moves
:state
:winner
:loser

"player-1"
:created
:rock
"player-1"
123_1
:waiting
:paper
"player-2"
123_2
:won
"player-2"
"player-1"

T1]
T1]
T2]
T2]
T2]
T2]
T3]
T3]
T3]
T3]
T3]
T3]
Aggregates?
Only by convention
cas (compare and set)
isComponent on relation

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

onsdag 16 oktober 13

Move
+ id
+ move
+ player
Query language
What to find
Where clauses

[entity attribute value]

Implicit joins
Call arbitrary function

onsdag 16 oktober 13
Query example - basic

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

onsdag 16 oktober 13
Query example - basic

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

[["jan.kronquist@jayway.com]
["player-1@gmail.com"]
["player-2@gmail.com"]]

onsdag 16 oktober 13
Query example - aggregation
[:find ?state (?count game)
:where
[?game :state ?state]]

onsdag 16 oktober 13
Query example - aggregation
[:find ?state (?count game)
:where
[?game :state ?state]]

[[:created
[:waiting
[:won
[:tied

onsdag 16 oktober 13

4]
1]
7]
3]]
Query example - aggregation
[:find ?state (?count game)
:where
[?game :state ?state]]

[[:created
[:waiting
[:won
[:tied

4]
1]
7]
3]]

inProgess = created + waiting

onsdag 16 oktober 13
Query example - aggregation
[:find ?state (?count game)
:where
[?game :state ?state]]
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) {
/projections/games-counter
s.completed++; {
return s;
created: 15,
}
completed: 10
});
}

onsdag 16 oktober 13

[[:created
[:waiting
[:won
[:tied

4]
1]
7]
3]]

inProgess = created + waiting
Query example - join

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

onsdag 16 oktober 13
Query at any time
(q ’[:find ?email
:where
[_ :email ?email]]
db)

onsdag 16 oktober 13
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
Query over time
(q ’[:find ?e (count ?tx)
:where
[?e :email _ ?tx]]
db)

onsdag 16 oktober 13
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
Java API

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

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

onsdag 16 oktober 13
More info
http://www.datomic.com/videos.html

onsdag 16 oktober 13
Comparison

onsdag 16 oktober 13
Comparison
Data model
Schema evolution
Queries
Recommendation

onsdag 16 oktober 13
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
Datomic Facts
✓ Support partial information
✓ Normalization support
✓ CRUD out of the box
๏ Static schema

onsdag 16 oktober 13
EventStore schema evolution
✓ New events
✓ New event attributes
✓ Event attributes rename (change deserialization)
✓ Projected state change (rebuild projection)
๏ Cross event refactoring

onsdag 16 oktober 13
Datomic schema evolution
✓ New or removed attributes
✓ New or removed entity types
✓ Move attributes between entities
๏ Fact attributes rename not possible
๏ Fact attribute type change not possible

onsdag 16 oktober 13
EventStore queries
✓ Projections use JavaScript
✓ Persistent
๏ Require projection

onsdag 16 oktober 13
Datomic queries
✓ Declarative
✓ Logic-based
✓ Allows calling out to your own code
๏ New language to learn

onsdag 16 oktober 13
When to use Event Sourcing?
Domains where events seem natural
Different teams with different models

onsdag 16 oktober 13
When to use Datomic?
Data can be modelled using entities and attributes
History is or may be interesting

onsdag 16 oktober 13
More details
http://www.jayway.com/author/jankronquist/
https://github.com/jankronquist
http://www.slideshare.net/jankronquist

onsdag 16 oktober 13
Questions?

onsdag 16 oktober 13

More Related Content

Viewers also liked

How to write your database: the story about Event Store
How to write your database: the story about Event StoreHow to write your database: the story about Event Store
How to write your database: the story about Event StoreVictor Haydin
 
DDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkDDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkbanq jdon
 
Cassandra - An Introduction
Cassandra - An IntroductionCassandra - An Introduction
Cassandra - An IntroductionMikio L. Braun
 
Analyze billions of records on Salesforce App Cloud with BigObject
Analyze billions of records on Salesforce App Cloud with BigObjectAnalyze billions of records on Salesforce App Cloud with BigObject
Analyze billions of records on Salesforce App Cloud with BigObjectSalesforce Developers
 
CQRS and Event Sourcing with Akka, Cassandra and RabbitMQ
CQRS and Event Sourcing with Akka, Cassandra and RabbitMQCQRS and Event Sourcing with Akka, Cassandra and RabbitMQ
CQRS and Event Sourcing with Akka, Cassandra and RabbitMQMiel Donkers
 
Row or Columnar Database
Row or Columnar DatabaseRow or Columnar Database
Row or Columnar DatabaseBiju Nair
 
Column-Stores vs. Row-Stores: How Different are they Really?
Column-Stores vs. Row-Stores: How Different are they Really?Column-Stores vs. Row-Stores: How Different are they Really?
Column-Stores vs. Row-Stores: How Different are they Really?Daniel Abadi
 
Building scalable rest service using Akka HTTP
Building scalable rest service using Akka HTTPBuilding scalable rest service using Akka HTTP
Building scalable rest service using Akka HTTPdatamantra
 
Introduction to column oriented databases
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databasesArangoDB Database
 
Introduction to Zabbix - Company, Product, Services and Use Cases
Introduction to Zabbix - Company, Product, Services and Use CasesIntroduction to Zabbix - Company, Product, Services and Use Cases
Introduction to Zabbix - Company, Product, Services and Use CasesZabbix
 
New microsoft office power point presentation
New microsoft office power point presentationNew microsoft office power point presentation
New microsoft office power point presentationZorigoo Bayar
 
Portraits. Artist, Tang Wei Min
Portraits. Artist, Tang Wei MinPortraits. Artist, Tang Wei Min
Portraits. Artist, Tang Wei MinCachi Chien
 
Final logo designs
Final logo designsFinal logo designs
Final logo designslelicordell
 
The Little Baker
The Little BakerThe Little Baker
The Little BakerCachi Chien
 
At the Speed of Lightning
At the Speed of LightningAt the Speed of Lightning
At the Speed of LightningBaynote
 
Peter Mitchev's Art
Peter Mitchev's ArtPeter Mitchev's Art
Peter Mitchev's ArtCachi Chien
 

Viewers also liked (20)

Intro to column stores
Intro to column storesIntro to column stores
Intro to column stores
 
How to write your database: the story about Event Store
How to write your database: the story about Event StoreHow to write your database: the story about Event Store
How to write your database: the story about Event Store
 
DDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkDDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFramework
 
Cassandra - An Introduction
Cassandra - An IntroductionCassandra - An Introduction
Cassandra - An Introduction
 
Analyze billions of records on Salesforce App Cloud with BigObject
Analyze billions of records on Salesforce App Cloud with BigObjectAnalyze billions of records on Salesforce App Cloud with BigObject
Analyze billions of records on Salesforce App Cloud with BigObject
 
Concurrency
ConcurrencyConcurrency
Concurrency
 
Flink Streaming
Flink StreamingFlink Streaming
Flink Streaming
 
CQRS and Event Sourcing with Akka, Cassandra and RabbitMQ
CQRS and Event Sourcing with Akka, Cassandra and RabbitMQCQRS and Event Sourcing with Akka, Cassandra and RabbitMQ
CQRS and Event Sourcing with Akka, Cassandra and RabbitMQ
 
Row or Columnar Database
Row or Columnar DatabaseRow or Columnar Database
Row or Columnar Database
 
Column-Stores vs. Row-Stores: How Different are they Really?
Column-Stores vs. Row-Stores: How Different are they Really?Column-Stores vs. Row-Stores: How Different are they Really?
Column-Stores vs. Row-Stores: How Different are they Really?
 
Building scalable rest service using Akka HTTP
Building scalable rest service using Akka HTTPBuilding scalable rest service using Akka HTTP
Building scalable rest service using Akka HTTP
 
Introduction to column oriented databases
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databases
 
Introduction to Zabbix - Company, Product, Services and Use Cases
Introduction to Zabbix - Company, Product, Services and Use CasesIntroduction to Zabbix - Company, Product, Services and Use Cases
Introduction to Zabbix - Company, Product, Services and Use Cases
 
New microsoft office power point presentation
New microsoft office power point presentationNew microsoft office power point presentation
New microsoft office power point presentation
 
Portraits. Artist, Tang Wei Min
Portraits. Artist, Tang Wei MinPortraits. Artist, Tang Wei Min
Portraits. Artist, Tang Wei Min
 
Final logo designs
Final logo designsFinal logo designs
Final logo designs
 
The Little Baker
The Little BakerThe Little Baker
The Little Baker
 
At the Speed of Lightning
At the Speed of LightningAt the Speed of Lightning
At the Speed of Lightning
 
24 εικονομαχία
24 εικονομαχία 24 εικονομαχία
24 εικονομαχία
 
Peter Mitchev's Art
Peter Mitchev's ArtPeter Mitchev's Art
Peter Mitchev's Art
 

Recently uploaded

Vip Delhi Ncr Call Girls Best Services Available
Vip Delhi Ncr Call Girls Best Services AvailableVip Delhi Ncr Call Girls Best Services Available
Vip Delhi Ncr Call Girls Best Services AvailableKomal Khan
 
Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price Andheri WhatsApp:+91-9833363713Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price Andheri WhatsApp:+91-9833363713Sonam Pathan
 
Zoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a trainingZoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a trainingRafik ABDI
 
Call Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts ServiceCall Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts ServiceTina Ji
 
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcEViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcEApsara Of India
 
Call Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call GirlsCall Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call Girlsssuser7cb4ff
 
Call Girls Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170Call Girls Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170Sonam Pathan
 
North Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full FunNorth Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full FunKomal Khan
 
Call Girls In Moti Bagh (8377877756 )-Genuine Rate Girls Service
Call Girls In Moti Bagh (8377877756 )-Genuine Rate Girls ServiceCall Girls In Moti Bagh (8377877756 )-Genuine Rate Girls Service
Call Girls In Moti Bagh (8377877756 )-Genuine Rate Girls Servicedollysharma2066
 
Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170Sonam Pathan
 
Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713Sonam Pathan
 
Gripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to MissGripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to Missget joys
 
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCRdollysharma2066
 
NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...
NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...
NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...Amil baba
 
Deconstruction theory ppt easy ppt for ms
Deconstruction theory ppt easy ppt for msDeconstruction theory ppt easy ppt for ms
Deconstruction theory ppt easy ppt for mshudamushtaq259
 
The Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty VixenThe Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty VixenSalty Vixen Stories & More
 
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书zdzoqco
 
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...Amil Baba Dawood bangali
 
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzersQUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzersSJU Quizzers
 

Recently uploaded (20)

Vip Delhi Ncr Call Girls Best Services Available
Vip Delhi Ncr Call Girls Best Services AvailableVip Delhi Ncr Call Girls Best Services Available
Vip Delhi Ncr Call Girls Best Services Available
 
Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price Andheri WhatsApp:+91-9833363713Call Girl Price Andheri WhatsApp:+91-9833363713
Call Girl Price Andheri WhatsApp:+91-9833363713
 
Zoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a trainingZoom In Game for ice breaking in a training
Zoom In Game for ice breaking in a training
 
Call Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts ServiceCall Girls in Faridabad 9000000000 Faridabad Escorts Service
Call Girls in Faridabad 9000000000 Faridabad Escorts Service
 
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcEViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
ViP Call Girls In Udaipur 9602870969 Gulab Bagh Escorts SeRvIcE
 
Call Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call GirlsCall Girls Ellis Bridge 7397865700 Independent Call Girls
Call Girls Ellis Bridge 7397865700 Independent Call Girls
 
young call girls in Hari Nagar,🔝 9953056974 🔝 escort Service
young call girls in Hari Nagar,🔝 9953056974 🔝 escort Serviceyoung call girls in Hari Nagar,🔝 9953056974 🔝 escort Service
young call girls in Hari Nagar,🔝 9953056974 🔝 escort Service
 
Call Girls Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170Call Girls Near The Corus Hotel New Delhi 9873777170
Call Girls Near The Corus Hotel New Delhi 9873777170
 
North Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full FunNorth Avenue Call Girls Services, Hire Now for Full Fun
North Avenue Call Girls Services, Hire Now for Full Fun
 
Call Girls In Moti Bagh (8377877756 )-Genuine Rate Girls Service
Call Girls In Moti Bagh (8377877756 )-Genuine Rate Girls ServiceCall Girls In Moti Bagh (8377877756 )-Genuine Rate Girls Service
Call Girls In Moti Bagh (8377877756 )-Genuine Rate Girls Service
 
Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170Call Girls Near Delhi Pride Hotel New Delhi 9873777170
Call Girls Near Delhi Pride Hotel New Delhi 9873777170
 
Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713Call Girl Contact Number Andheri WhatsApp:+91-9833363713
Call Girl Contact Number Andheri WhatsApp:+91-9833363713
 
Gripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to MissGripping Adult Web Series You Can't Afford to Miss
Gripping Adult Web Series You Can't Afford to Miss
 
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
8377087607 Full Enjoy @24/7 Call Girls in Patel Nagar Delhi NCR
 
NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...
NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...
NO1 Certified Black magic/kala jadu,manpasand shadi in lahore,karachi rawalpi...
 
Deconstruction theory ppt easy ppt for ms
Deconstruction theory ppt easy ppt for msDeconstruction theory ppt easy ppt for ms
Deconstruction theory ppt easy ppt for ms
 
The Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty VixenThe Fine Line Between Honest and Evil Comics by Salty Vixen
The Fine Line Between Honest and Evil Comics by Salty Vixen
 
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
办理滑铁卢大学毕业证成绩单|购买加拿大文凭证书
 
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
NO1 WorldWide Amil Baba In Karachi Kala Jadu In Karachi Amil baba In Karachi ...
 
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzersQUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
QUIZ BOLLYWOOD ( weekly quiz ) - SJU quizzers
 

Guide to Append-Only Data Stores and Event Sourcing