SlideShare une entreprise Scribd logo
1  sur  119
Télécharger pour lire hors ligne
vs
Immutable data stores
onsdag 25 september 13
What?
onsdag 25 september 13
Immutable data stores
Only add, never remove or change
Can retrieve old values
onsdag 25 september 13
Source code
Version controlled
Keep all versions
onsdag 25 september 13
Example domain
onsdag 25 september 13
Rock - Paper - Scissors
onsdag 25 september 13
http://rock-paper-scissors.com/
The future Facebook of Rock Paper Scissors
Millions of users
Many games per user
onsdag 25 september 13
Playing the game
Player A
Player B
Server
onsdag 25 september 13
Playing the game
Player A
Player B
Server
Game 123
onsdag 25 september 13
Playing the game
Player A
Player B
Server
paper
Game 123
onsdag 25 september 13
Playing the game
Player A
Player B
Server
paper
Player B: paper
Game 123
onsdag 25 september 13
Playing the game
Player A
Player B
Server
rock
Player B: paper
Player A: rock
Game 123
onsdag 25 september 13
Playing the game
Player A
Player B
Server
Player B: paper
Player A: rock
Game 123
Game 123
winner: Player B
loser: Player A
onsdag 25 september 13
Playing the game
Player A
Player B
Server
Player B: paper
Player A: rock
Game 123
Game 123
winner: Player B
loser: Player A
CREATED WAITING
GAME WON
GAME TIED
any move
other move
(victory)
other move
(tie)
onsdag 25 september 13
Entities
onsdag 25 september 13
Entities
Player
+ id
+ name
+ email
onsdag 25 september 13
Entities
Game
+ id
+ state
+ players
+ moves
+ winner
+ loser
Player
+ id
+ name
+ email
onsdag 25 september 13
Entities
Game
+ id
+ state
+ players
+ moves
+ winner
+ loser
Move
+ move
+ player
Player
+ id
+ name
+ email
onsdag 25 september 13
Actions
Create game
Make move
Get game result
POST /games
POST /games/123
move=rock
GET /games/123
onsdag 25 september 13
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
Event Sourcing
with
Event Store
onsdag 25 september 13
Event Sourcing
Events that have happened
Ordered in time
Source of truth
onsdag 25 september 13
http://geteventstore.com
Runs on .NET and Mono
Free (store) or Commercial (HA)
API
Custom TCP (c#)
ATOM over HTTP (xml/json)
Features
Event streams, projections, generate new events (CEP)
€1500/year
onsdag 25 september 13
Event example
Server EventStore
onsdag 25 september 13
Event example
Server
CreateGameCommand{:game 123 :creator "player-1"}
EventStore
onsdag 25 september 13
Event example
Server
CreateGameCommand{:game 123 :creator "player-1"}
GameCreatedEvent{:game 123 :creator "player-1"}
EventStore
onsdag 25 september 13
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
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
GameCreatedEvent{:game 123, :creator "player-1", :time 1}
MoveMadeEvent{:game 123, :player "player-1", :move "rock", :time 2}
Current state?
onsdag 25 september 13
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
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
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
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
Aggregates as Event Streams
event1 GameCreatedEvent{:game 1...}
event2 MoveMadeEvent{:game 1....}
stream = game-1
version = 2
onsdag 25 september 13
Aggregates as Event Streams
event1 GameCreatedEvent{:game 1...}
event2 MoveMadeEvent{:game 1....}
stream = game-1
version = 2
event1 GameCreatedEvent{:game 2...}
event2 MoveMadeEvent{:game 2....}
event3 MoveMadeEvent{:game 2....}
event4 GameWonEvent{:game 2....}
stream = game-2
version = 4
onsdag 25 september 13
Aggregates as Event Streams
event1 GameCreatedEvent{:game 1...}
event2 MoveMadeEvent{:game 1....}
stream = game-1
version = 2
event1 GameCreatedEvent{:game 2...}
event2 MoveMadeEvent{:game 2....}
event3 MoveMadeEvent{:game 2....}
event4 GameWonEvent{:game 2....}
stream = game-2
version = 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
Projections
GameCreatedEvent{:game 1...}
MoveMadeEvent{:game 1....}
GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}
onsdag 25 september 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 25 september 13
Projections
GameCreatedEvent{:game 1...}
MoveMadeEvent{:game 1....}
GameCreatedEvent{:game 2...}
MoveMadeEvent{:game 2....}
MoveMadeEvent{:game 2....}
GameWonEvent{:game 2....}
onsdag 25 september 13
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
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 25 september 13
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 = 2
GameCreatedEvent{:game 3...}
onsdag 25 september 13
Projections in Javascript
fromAll()
.when({
$init: function () {
return { created: 0, completed:0 };
},
});
onsdag 25 september 13
Projections in Javascript
fromAll()
.when({
$init: function () {
return { created: 0, completed:0 };
},
});
GameCreatedEvent: function(s, e) {
s.created++;
return s;
},
onsdag 25 september 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 25 september 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 25 september 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;
}
/projections/games-counter
{
created: 15,
completed: 10
}
onsdag 25 september 13
External Projections
events
Business logic
onsdag 25 september 13
External Projections
events events
Business logic Projections
onsdag 25 september 13
External Projections
Consistent
Available
events events
Business logic Projections
onsdag 25 september 13
External Projections
Commands Queries
Consistent
Available
events events
onsdag 25 september 13
System with EventStore
onsdag 25 september 13
System with EventStore
Command
Handler
onsdag 25 september 13
System with EventStore
1.command Command
Handler
onsdag 25 september 13
System with EventStore
1.command Event
Store
Command
Handler
2.get events
onsdag 25 september 13
System with EventStore
1.command Event
Store
Command
Handler
2.get events
3.add events
onsdag 25 september 13
System with EventStore
1.command Event
Store
Command
Handler
2.get events
3.add events
4.update
projections
onsdag 25 september 13
System with EventStore
1.command Event
Store
Command
Handler
2.get events
3.add events
4.update
projections
5.get events
or projections
Some
service
onsdag 25 september 13
System with EventStore
1.command Event
Store
Command
Handler
2.get events
6.update state
3.add events
4.update
projections
5.get events
or projections
Some
service
onsdag 25 september 13
System with EventStore
1.command Event
Store
Command
Handler
2.get events
6.update state
3.add events
4.update
projections
7.query
5.get events
or projections
Some
service
onsdag 25 september 13
Datomic
onsdag 25 september 13
http://www.datomic.com/
Runs on JVM
Free (3 peers, local storage) or Commercial (HA, distrib)
Features
ACID transactions, declarative query engine
€2300
onsdag 25 september 13
Fact
Something known to have happened or existed
onsdag 25 september 13
Fact
Something known to have happened or existed
2004-10-01 the email of Jan was ”jan.kronquist@jayway.se”
onsdag 25 september 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 25 september 13
Atomic fact (datom)
Entity
Attribute
Value
Time
onsdag 25 september 13
Atomic fact (datom)
Entity
Attribute
Value
Time
The person Jan Kronquist
email
”jan.kronquist@jayway.se”
2004-10-01
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
query
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
query
query
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
query
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
query
onsdag 25 september 13
Data perception
Facts
Add facts
Add more facts
Even more facts
time
query
onsdag 25 september 13
Database deconstructed
onsdag 25 september 13
Database deconstructed
Transactor
Consistency by serializing transactions
onsdag 25 september 13
Database deconstructed
Transactor
Consistency by serializing transactions
Peer
Your code + Query engine
onsdag 25 september 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 25 september 13
System with Datomic
Transactor
Distributed Storage Service
Peer APeer A
onsdag 25 september 13
System with Datomic
Transactor
Distributed Storage Service
Peer APeer A
1.command
onsdag 25 september 13
System with Datomic
Transactor
Distributed Storage Service
Peer APeer A
2.read and cache
1.command
onsdag 25 september 13
System with Datomic
Transactor
Distributed Storage Service
Peer A
3.transact
Peer A
2.read and cache
1.command
onsdag 25 september 13
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
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
Datomic example
Peer Transactor
onsdag 25 september 13
Datomic example
Peer
CreateGameCommand{:game 123 :creator "player-1"}
Transactor
onsdag 25 september 13
Datomic example
Peer
CreateGameCommand{:game 123 :creator "player-1"}
[123 :creator "player-1" T1]
[123 :state :created T1]
Transactor
onsdag 25 september 13
Datomic example
Peer
CreateGameCommand{:game 123 :creator "player-1"}
[123 :creator "player-1" T1]
[123 :state :created T1]
Transactor
["player-1" :email "player@gmail.com" T0]
onsdag 25 september 13
Datomic example
Peer
CreateGameCommand{:game 123 :creator "player-1"}
[123 :creator "player-1" T1]
[123 :state :created T1]
Transactor
onsdag 25 september 13
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
Datomic example
Peer
CreateGameCommand{:game 123 :creator "player-1"}
[123 :creator "player-1" T1]
[123 :state :created T1]
Transactor
onsdag 25 september 13
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
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
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
What to find
Where clauses [entity attribute value]
Implicit joins
Call arbitrary function
Query language
onsdag 25 september 13
Query example - basic
[:find ?email
:where
[_ :email ?email]]
onsdag 25 september 13
Query example - basic
[:find ?email
:where
[_ :email ?email]]
[["jan.kronquist@jayway.com]
["player-1@gmail.com"]
["player-2@gmail.com"]]
onsdag 25 september 13
Query example - aggregation
[:find ?state (?count game)
:where
[?game :state ?state]]
onsdag 25 september 13
Query example - aggregation
[:find ?state (?count game)
:where
[?game :state ?state]]
[[:created 4]
[:waiting 1]
[:won 7]
[:tied 3]]
onsdag 25 september 13
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
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
Query example - join
[:find ?email (count ?game)
:where
[?player :email ?email]
[?game :winner ?player]]
onsdag 25 september 13
Query at any time
(q ’[:find ?email
:where
[_ :email ?email]]
db)
onsdag 25 september 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 25 september 13
Query over time
(q ’[:find ?e (count ?tx)
:where
[?e :email _ ?tx]]
db)
onsdag 25 september 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 25 september 13
Java API
List<Object> results =
Peer.q(someQuery, conn.db());
Future<Map> txResult = conn.transact(data_tx);
onsdag 25 september 13
Comparison
onsdag 25 september 13
Comparison
Data model
Schema evolution
Queries
Recommendation
onsdag 25 september 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 25 september 13
Datomic Facts
✓ Support partial information
✓ Normalization support
✓ CRUD out of the box
๏ Static schema
onsdag 25 september 13
✓ 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
✓ 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
✓ Projections use JavaScript
✓ Persistent
๏ Require projection
EventStore queries
onsdag 25 september 13
✓ Declarative
✓ Logic-based
✓ Allows calling out to your own code
๏ New language to learn
Datomic queries
onsdag 25 september 13
When to use Event Sourcing?
Domains where events seem natural
Different teams with different models
onsdag 25 september 13
When to use Datomic?
Data can be modelled using entities and attributes
History is or may be interesting
onsdag 25 september 13
More details
http://www.jayway.com/author/jankronquist/
https://github.com/jankronquist
onsdag 25 september 13
Questions?
onsdag 25 september 13

Contenu connexe

En vedette

Reverse Engineering
Reverse EngineeringReverse Engineering
Reverse Engineering
dswanson
 

En vedette (20)

The Unanticipated Benefits of Content Curation
The Unanticipated Benefits of Content CurationThe Unanticipated Benefits of Content Curation
The Unanticipated Benefits of Content Curation
 
Google Analytics
Google AnalyticsGoogle Analytics
Google Analytics
 
Manchester city
Manchester cityManchester city
Manchester city
 
Datomic
DatomicDatomic
Datomic
 
Jim rohn
Jim  rohnJim  rohn
Jim rohn
 
Datomic
DatomicDatomic
Datomic
 
Datomic
DatomicDatomic
Datomic
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Tesco
TescoTesco
Tesco
 
Management Consulting
Management ConsultingManagement Consulting
Management Consulting
 
French Property Market 2014
French Property Market 2014French Property Market 2014
French Property Market 2014
 
intel core i7
intel core i7intel core i7
intel core i7
 
Clojure
ClojureClojure
Clojure
 
Medical devices
Medical devicesMedical devices
Medical devices
 
French Property market 2015 - Cushman & Wakefield
French Property market 2015 - Cushman & WakefieldFrench Property market 2015 - Cushman & Wakefield
French Property market 2015 - Cushman & Wakefield
 
Cerebral Palsy
Cerebral PalsyCerebral Palsy
Cerebral Palsy
 
Bill Gates, Who is he?
Bill Gates, Who is he?Bill Gates, Who is he?
Bill Gates, Who is he?
 
Simo Ahava - Tag Management Solutions – Best. Data. Ever. MKTFEST 2014
Simo Ahava - Tag Management Solutions – Best. Data. Ever. MKTFEST 2014Simo Ahava - Tag Management Solutions – Best. Data. Ever. MKTFEST 2014
Simo Ahava - Tag Management Solutions – Best. Data. Ever. MKTFEST 2014
 
In memory computing
In memory computingIn memory computing
In memory computing
 
Reverse Engineering
Reverse EngineeringReverse Engineering
Reverse Engineering
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 

JavaZone 2013 - Datomic vs EventStore