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

What's hot

AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017
AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017
AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017
Amazon Web Services Korea
 

What's hot (20)

Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
POO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em JavaPOO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em Java
 
How Jenkins Builds the Netflix Global Streaming Service
How Jenkins Builds the Netflix Global Streaming ServiceHow Jenkins Builds the Netflix Global Streaming Service
How Jenkins Builds the Netflix Global Streaming Service
 
Linguagem de Programação PERL
Linguagem de Programação PERLLinguagem de Programação PERL
Linguagem de Programação PERL
 
JavaScript Fetch API
JavaScript Fetch APIJavaScript Fetch API
JavaScript Fetch API
 
Models for hierarchical data
Models for hierarchical dataModels for hierarchical data
Models for hierarchical data
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Aula 6 aed - registros
Aula 6   aed - registrosAula 6   aed - registros
Aula 6 aed - registros
 
Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...Modernization patterns to refactor a legacy application into event driven mic...
Modernization patterns to refactor a legacy application into event driven mic...
 
The Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable DesignThe Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable Design
 
Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략Mongo DB 성능최적화 전략
Mongo DB 성능최적화 전략
 
Rust vs C++
Rust vs C++Rust vs C++
Rust vs C++
 
Mini Curso de PHP
Mini Curso de PHPMini Curso de PHP
Mini Curso de PHP
 
AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017
AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017
AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 - AWS Summit Seoul 2017
 
Whitebox testing of Spring Boot applications
Whitebox testing of Spring Boot applicationsWhitebox testing of Spring Boot applications
Whitebox testing of Spring Boot applications
 
O maravilhoso mundo dos webhooks
O maravilhoso mundo dos webhooksO maravilhoso mundo dos webhooks
O maravilhoso mundo dos webhooks
 
Indexing
IndexingIndexing
Indexing
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
POO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em JavaPOO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em Java
 
WebAssembly Overview
WebAssembly OverviewWebAssembly Overview
WebAssembly Overview
 

Viewers also liked

Introduction to column oriented databases
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databases
ArangoDB Database
 
New microsoft office power point presentation
New microsoft office power point presentationNew microsoft office power point presentation
New microsoft office power point presentation
Zorigoo Bayar
 
Final logo designs
Final logo designsFinal logo designs
Final logo designs
lelicordell
 

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

Call Girls In Goa 9316020077 Goa Call Girl By Indian Call Girls Goa
Call Girls In Goa  9316020077 Goa  Call Girl By Indian Call Girls GoaCall Girls In Goa  9316020077 Goa  Call Girl By Indian Call Girls Goa
Call Girls In Goa 9316020077 Goa Call Girl By Indian Call Girls Goa
sexy call girls service in goa
 
Russian Escorts Agency In Goa 💚 9316020077 💚 Russian Call Girl Goa
Russian Escorts Agency In Goa  💚 9316020077 💚 Russian Call Girl GoaRussian Escorts Agency In Goa  💚 9316020077 💚 Russian Call Girl Goa
Russian Escorts Agency In Goa 💚 9316020077 💚 Russian Call Girl Goa
sexy call girls service in goa
 
CHEAP Call Girls in Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in  Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in  Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Goa Call "Girls Service 9316020077 Call "Girls in Goa
Goa Call "Girls  Service   9316020077 Call "Girls in GoaGoa Call "Girls  Service   9316020077 Call "Girls in Goa
Goa Call "Girls Service 9316020077 Call "Girls in Goa
sexy call girls service in goa
 
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Apsara Of India
 
Goa Call Girls 9316020077 Call Girls In Goa By Russian Call Girl in goa
Goa Call Girls 9316020077 Call Girls  In Goa By Russian Call Girl in goaGoa Call Girls 9316020077 Call Girls  In Goa By Russian Call Girl in goa
Goa Call Girls 9316020077 Call Girls In Goa By Russian Call Girl in goa
russian goa call girl and escorts service
 

Recently uploaded (20)

Call Girls in Barasat | 7001035870 At Low Cost Cash Payment Booking
Call Girls in Barasat | 7001035870 At Low Cost Cash Payment BookingCall Girls in Barasat | 7001035870 At Low Cost Cash Payment Booking
Call Girls in Barasat | 7001035870 At Low Cost Cash Payment Booking
 
Call Girls In Goa 9316020077 Goa Call Girl By Indian Call Girls Goa
Call Girls In Goa  9316020077 Goa  Call Girl By Indian Call Girls GoaCall Girls In Goa  9316020077 Goa  Call Girl By Indian Call Girls Goa
Call Girls In Goa 9316020077 Goa Call Girl By Indian Call Girls Goa
 
Russian Escorts Agency In Goa 💚 9316020077 💚 Russian Call Girl Goa
Russian Escorts Agency In Goa  💚 9316020077 💚 Russian Call Girl GoaRussian Escorts Agency In Goa  💚 9316020077 💚 Russian Call Girl Goa
Russian Escorts Agency In Goa 💚 9316020077 💚 Russian Call Girl Goa
 
Bhimtal ❤CALL GIRL 8617697112 ❤CALL GIRLS IN Bhimtal ESCORT SERVICE❤CALL GIRL
Bhimtal ❤CALL GIRL 8617697112 ❤CALL GIRLS IN Bhimtal ESCORT SERVICE❤CALL GIRLBhimtal ❤CALL GIRL 8617697112 ❤CALL GIRLS IN Bhimtal ESCORT SERVICE❤CALL GIRL
Bhimtal ❤CALL GIRL 8617697112 ❤CALL GIRLS IN Bhimtal ESCORT SERVICE❤CALL GIRL
 
CHEAP Call Girls in Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in  Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in  Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Hotel And Home Service Available Kolkata Call Girls Howrah ✔ 6297143586 ✔Call...
Hotel And Home Service Available Kolkata Call Girls Howrah ✔ 6297143586 ✔Call...Hotel And Home Service Available Kolkata Call Girls Howrah ✔ 6297143586 ✔Call...
Hotel And Home Service Available Kolkata Call Girls Howrah ✔ 6297143586 ✔Call...
 
Hotel And Home Service Available Kolkata Call Girls South End Park ✔ 62971435...
Hotel And Home Service Available Kolkata Call Girls South End Park ✔ 62971435...Hotel And Home Service Available Kolkata Call Girls South End Park ✔ 62971435...
Hotel And Home Service Available Kolkata Call Girls South End Park ✔ 62971435...
 
Goa Call "Girls Service 9316020077 Call "Girls in Goa
Goa Call "Girls  Service   9316020077 Call "Girls in GoaGoa Call "Girls  Service   9316020077 Call "Girls in Goa
Goa Call "Girls Service 9316020077 Call "Girls in Goa
 
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
 
↑Top Model (Kolkata) Call Girls Behala ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Behala ⟟ 8250192130 ⟟ High Class Call Girl In...↑Top Model (Kolkata) Call Girls Behala ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Behala ⟟ 8250192130 ⟟ High Class Call Girl In...
 
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
 
Independent Garulia Escorts ✔ 9332606886✔ Full Night With Room Online Booking...
Independent Garulia Escorts ✔ 9332606886✔ Full Night With Room Online Booking...Independent Garulia Escorts ✔ 9332606886✔ Full Night With Room Online Booking...
Independent Garulia Escorts ✔ 9332606886✔ Full Night With Room Online Booking...
 
Science City Kolkata ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sex...
Science City Kolkata ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sex...Science City Kolkata ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sex...
Science City Kolkata ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sex...
 
📞 Contact Number 8617697112 VIP Ganderbal Call Girls
📞 Contact Number 8617697112 VIP Ganderbal Call Girls📞 Contact Number 8617697112 VIP Ganderbal Call Girls
📞 Contact Number 8617697112 VIP Ganderbal Call Girls
 
Top Rated Pune Call Girls Dhayari ⟟ 6297143586 ⟟ Call Me For Genuine Sex Ser...
Top Rated  Pune Call Girls Dhayari ⟟ 6297143586 ⟟ Call Me For Genuine Sex Ser...Top Rated  Pune Call Girls Dhayari ⟟ 6297143586 ⟟ Call Me For Genuine Sex Ser...
Top Rated Pune Call Girls Dhayari ⟟ 6297143586 ⟟ Call Me For Genuine Sex Ser...
 
Call Girls Manjri Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Manjri Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Manjri Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Manjri Call Me 7737669865 Budget Friendly No Advance Booking
 
Goa Call Girls 9316020077 Call Girls In Goa By Russian Call Girl in goa
Goa Call Girls 9316020077 Call Girls  In Goa By Russian Call Girl in goaGoa Call Girls 9316020077 Call Girls  In Goa By Russian Call Girl in goa
Goa Call Girls 9316020077 Call Girls In Goa By Russian Call Girl in goa
 
Model Call Girls In Velappanchavadi WhatsApp Booking 7427069034 call girl ser...
Model Call Girls In Velappanchavadi WhatsApp Booking 7427069034 call girl ser...Model Call Girls In Velappanchavadi WhatsApp Booking 7427069034 call girl ser...
Model Call Girls In Velappanchavadi WhatsApp Booking 7427069034 call girl ser...
 
𓀤Call On 6297143586 𓀤 Sonagachi Call Girls In All Kolkata 24/7 Provide Call W...
𓀤Call On 6297143586 𓀤 Sonagachi Call Girls In All Kolkata 24/7 Provide Call W...𓀤Call On 6297143586 𓀤 Sonagachi Call Girls In All Kolkata 24/7 Provide Call W...
𓀤Call On 6297143586 𓀤 Sonagachi Call Girls In All Kolkata 24/7 Provide Call W...
 
Independent Joka Escorts ✔ 8250192130 ✔ Full Night With Room Online Booking 2...
Independent Joka Escorts ✔ 8250192130 ✔ Full Night With Room Online Booking 2...Independent Joka Escorts ✔ 8250192130 ✔ Full Night With Room Online Booking 2...
Independent Joka Escorts ✔ 8250192130 ✔ Full Night With Room Online Booking 2...
 

Append only data stores