SlideShare a Scribd company logo
1 of 99
Download to read offline
Eventsourcing 
with%PHP%and%MongoDB 
Data$Analysis$with$events
Hello! 
My#name#is#Jacopo&Nardiello 
• Programmer,*currently*located*in*London 
• I*care*about*code*quality 
• If*it's*not*tested,*it*doesn't*exist. 
If#you#want#to#follow#me#@jnardiello
What%is%this%talk%about
A"li%le"bit"of"context
About&Onebip 
Mobile'payments!pla%orm. 
Start,up!born!in!2005,!acquired!by! 
Neomobile!group!in!2011.! 
Onebip'today: 
.'70'countries 
.'200+'carriers 
.'5'billions'registered'users
It#all#started#with#a#Monolith 
LAMP%stack
To#Distributed#Systems 
self%contained-services-talking-via-REST
Modern'Services 
First&class&modern&NoSQL&distributed&dbs
But$the$Monolith$is$s)ll$there
The$problem 
A"repor'ng"horror"story
We#need#three#new#reports! 
—"Manager 
Sure,&no&problem!
Deal%with%the%legacy%SQL%Schema
Deal%with%MongoDB
A"li%le"bit"of"queries"here, 
a"li%le"bit"of"map/reduce"there
1"month"later...
Reports(are(finally(ready!
un#l...
Your%queries%are%killing%produc2on! 
—"SysAdmin
Heavy&querying&op/miza/on 
New$indexes s"ll$not$enough
Let's&re(use&data&from&other&reports 
(don't'do'that)
DB#is#Ok,#reports#delivered.
but$then...
Huston,(we(have(a(problem.(Reports( 
are(not(consistent((with(other( 
reports) 
—"business"guy
Mistakes 
were 
made
#1 
Avoid&Mul*ple&sources&of&truth 
It's%hard%to%compare%different%data%from%different%in%a%distributed% 
system%spli7ed%across%mul8ple%domains
#2 
Ubiquitous)language 
Same%words,%different%concepts%across%domains
#3 
Fault&tolerance&to&change 
Changing'a'report'shouldn't'have'side'effects
Most%common%solu+ons
#1 
ETL$+$Map/Reduce
#2 
DWH$+$Consultants
#3#Mad#science 
(Yeppa!)
What%we%wanted
Must%have 
No#down'me#in#produc'on 
Consistent(across(domains
Nice%to%have 
A"system"elas*c"enough"to"extract"any"metric 
Real%me'data
In#DDD#we#found#the#light
Eventsourcing-&-CQRS
Eventsourcing 
The$fundamental$idea$of$Event$Sourcing$is$that$of$ensuring(every( 
change(to(the(state(of(an(applica3on(is(captured(in(an(event(object,$ 
and$that$these$event$objects$are$themselves$stored(in(the(sequence( 
they(were(applied 
—(Mar3n(Fowler
Unrolling(a(stream(of(events 
Star%ng(from(the(beginning(of(%me,(you(are( 
literally(unrolling(history(to(reach(the(state(in(a( 
given(%me
Idea%#1 
Every&change&to&the&state&of&your&applica4on&is&captured&in&an& 
event&object 
"User%Logged%In",#"Payment%Sent",#"User%Landed"
Idea%#2 
Events'are'stored'in'the'sequence'they' 
were'applied'inside'an'eventstore
Command'Query'Responsibility' 
Segrega6on 
(CQRS)
Commands 
Anything(that(happens(in(one(of(your(domains(is(triggered(by(a( 
command(and(generate(one(or(more(events. 
Order received --> payment sent --> Items queued 
--> Confirmation email sent
Idea%#3 
Everything+is+an+event.+No+more+state.
Query 
Generate'read'models'from'events'depending'how'data'needs'to' 
be'actually'used'(by'users'and'other'applica9on'internals)
Idea%#4 
One$way$to$store$data/events$but$poten2ally$infinite$ways$to$read$ 
them 
A"prac'cal"example 
Tech%ops,%Business%control,%Monitoring,%Accoun4ng%they%are%all% 
interested%in%reading%data%from%different%views.
Healthy(NoSQL
You$start$with$this 
{ 
"_id": ObjectId("123"), 
"username": "Flash", 
"city": …, 
"phone": …, 
"email": …, 
}
The$more$successful$your$company$is,$the$ 
more$people 
... 
The$more$people,$the$more$views
With%documental%dbs%it's%magically%easy%to%add%new%fields%to%your% 
collec7ons.
Soon$you$might$end$up$ 
with 
{ 
"_id": ObjectId("123"), 
"username": "Flash", 
"city": …, 
"phone": …, 
"email": …, 
"created_at": …, 
"updated_at": …, 
"ever_tried_to_purchase_something": …, 
"canceled_at": …, 
"acquisition_channel": …, 
"terminated_at": …, 
"latest_purchase_date": …, 
… 
}
A"bomb"wai)ng"to"detonate 
It's%impossible%to%keep%adding%state%changes%to%your%documents%and% 
then%expect%to%be%able%to%extract%them%with%a%single%query.
Exploring*Tools
EventStore 
• Engineered)for)event)sourcing 
• Supports)projec4ons 
• By)the)father)of)CQRS 
• Great)performances 
The$bad 
Win$Only.$Run$on$*nix$with$Mono,$s4ll$too$unstable.
LevelWHEN) 
An#eventstore#built#with#Node.js#and#LevelDB 
8#Faster#than#light 
8#Completely#custom,#no#tool#to#handle#aggregates
The$known$path 
• PHP$(any$other$language$would$just$do$ 
fine) 
• MongoDB$2.x
Why$MongoDB 
Events'are'not'rela,onal 
Scales'Well 
Awesome'aggrega+on'framework
Hands&on
Storing(Events
The$write$architecture 
Service | 
 | 
 [event payload] | 
 | 
Service --- Queue System <------------> API -> MongoDB 
/ | 
/ [event payload] | 
/ | 
Service |
Queues
MongoDB'RS 
A"mongod"replica*set"with"two"logical"dbs." 
1."Eventstore"DB"where"we"would"store" 
2."Repor=ng"DB"where"we"would"store"aggregates"and"final"reports
Anatomy(of(an(event 
{ 
'_id' : '3318c11e-fe60-4c80-a2b2-7add681492d9', 
'type': 'an-event-type', 
'data': { 
'meta' : { 
… 
}, 
'payload' : { 
… 
} 
} 
} 
Storing(events
Anatomy(of(an(event 
'meta' : { 
'creation_date': ISODate("2014-21-11T00:00:01Z"), 
'saved_date': ISODate("2014-21-11T00:00:02Z"), 
'source': 'some-bounded-context', 
'correlation_id': 'a-correlation-id' 
}, 
'payload' : { 
'user_id': '1234', 
'animal': 'unicorn', 
'colour': 'pink', 
'purchase_date': ISODate("2014-21-11T00:00:00Z"), 
'price': '20fantaueros' 
} 
Storing(events
Don't&trust&the&network:&Idempotence 
{ 
'_id' : '3318c11e-fe60-4c80-a2b2-7add681492d9', 
… 
} 
The$_id$field$is$actually$defined$client0side$and$ensures$ 
idempotence$if$an$event$is$received$two$8mes.
Indexes 
• Events(collec,ons(are(HUGE((~100M*N(documents) 
• Use(indexes(wisely(as(they(are(necessary(yet(expensive( 
• With(suggested(events(structure:(type + 
data.meta.created_at
Benchmarking 
How$many$events/second$can$you$store? 
Our$machines$were$able$to$store$roughly$150$events/sec.$This$ 
number$can$be$greatly$increased$with$dedicated$IOPS,$more$ 
aggressive$inser@ng$policies,$etc..
Final&Tips 
• Use%SSDs%on%your%storage%machines 
• Pay%a5en6on%to%write%concerns
From%Events%to%Meaningful%Metrics
The$Event$Processing$Pipeline 
Sequential Projector -> Event Mapper -> Projection -> Aggregation
A"real"life"problem 
What%is%the%conversion%rate%of%our%registered%users?
#1#The#registra-on#event 
{ 
'_id' : '3318c11e-fe60-4c80-a2b2-7add681492d9', 
'type': 'user-registered', 
'data': { 
'meta' : { 
'save_date': ISODate("2014-21-11T00:00:09Z"), 
'created_at': ISODate("2014-21-11T00:00:01Z"), 
'source': 'core-domain', 
'correlation_id': 'user-123456' 
}, 
'payload' : { 
'user_id': 123, 
'username': 'flash', 
'email': 'a-dummy-email@gmail.com', 
'country': 'IT' 
} 
} 
}
#2#The#purchase#event 
{ 
'_id' : '3318c11e-fe60-4c80-a2b2-7add681492d9', 
'type': 'user-purchased', 
'data': { 
'meta' : { 
'save_date': ISODate("2014-21-11T00:10:09Z"), 
'created_at': ISODate("2014-21-11T00:10:01Z"), 
'source': 'payment-gateway', 
'correlation_id': 'user-123456' 
}, 
'payload' : { 
'user_id': 123, 
'email': 'a-dummy-email@gmail.com', 
'amount': 20, 
'value': EUR, 
'payment': 'credit_card', 
'item': 'fluffy cat' 
} 
} 
}
Sequen&al)projector)(1) 
Divides'the'stream'of'events'into'batches,'filters'events'by'type' 
and'pass'those'of'interest'to'the'mapper' 
[]->[x]->[]->[x]->[]->[]->[]->[] 
|--------------| |------------| 
| 
| 
| 
| 
---> Projector
Sequen&al)projector)(2) 
• It's&a&good&idea&to&select&fixed&sizes&batches&to&avoid&memory& 
problems&when&you&load&your&Cursor&in&memory 
• Could&be&a&long=running&process&selec>ng&events&as&they&arrive& 
in&real%me
Event&Mapper&(1) 
Translates)event)fields)to)the)Read)Model)domain. 
Takes&an&event&as&input,&applies&a&bunch&of&logic&and&will&return&a& 
list&of&Read&Model&fields.
Event&Mapper&(2) 
Input&Event:& 
user-registered 
Output: 
$output = [ 
'user_id' => 123, // simply copied 
'user_name' => 'flash', // simply copied 
'email' => 'a-dummy-email@gmail.com', // simply copied 
'registered_at' => "2014-21-11T00:00:01Z" // From the data.meta.created_at event field 
];
Event&Mapper&(3) 
Input&Event:& 
user-purchased 
Output: 
$output = [ 
'user_id' => 123, // simply copied 
'email' => 'a-dummy-email@gmail.com', // simply copied 
'purchased_at': "2014-21-11T00:10:01Z" // From the data.meta.created_at event field 
];
Projec'on)(1) 
Essen%ally)it)is)your)read)model.)The$data$that$the$business$is$ 
interested$in.
The$Projec*on$,$a.er$event#1$(2) 
db.users_conversion_rate_projection.findOne() 
{ 
'user_id': 123, 
'user_name': 'flash', 
'email': 'a-dummy-email@gmail.com', 
'registered_at': "2014-21-11T00:00:01Z" 
}
The$Projec*on$,$a.er$event#2$(3) 
{ 
'user_id': 123, 
'user_name': 'flash', 
'email': 'a-dummy-email@gmail.com', 
'registered_at': "2014-21-11", 
'purchased_at': "2014-21-11" // Added this field and rewrote others 
}
The$Projec*on$,$collec*on 
{ 
'user_id': 123, 
'user_name': 'flash', 
'email': 'a-dummy-email@gmail.com', 
'registered_at': "2014-21-11", 
'purchased_at': "2014-21-11" // Added this field and rewrote others 
} 
{ 
'user_id': 456, 
'user_name': 'batman', 
'email': 'a-dummy-email@gmail.com', 
'registered_at': "2014-21-11", 
'purchased_at': "2014-21-11" // Added this field and rewrote others 
} 
{ 
'user_id': 789, 
'user_name': 'superman', 
'email': 'a-dummy-email@gmail.com', 
'registered_at': "2014-21-12", 
'purchased_at': "2014-21-12" // Added this field and rewrote others 
}
The$Projec*on$,$A$few$thoughts$(4) 
Note%that%we%didn't%copy%from%events%to%projec6on%all%the%available% 
fields.%Just%relevant%ones.
From%these%two%events%we%could%have%generated%infinite%read% 
models%such%as: 
• List&all&purchased&products&and&related&amounts&for&the&company& 
buyers& 
• Map&all&sales&and&revenues&for&our&accoun8ng&dept 
• List&transac8ons&for&the&financial&department
One$way$to$write,$infinite$ways$to$ 
read!
The$aggrega(on$(1)$.$Total$registered$users 
var registered = db.users_conversion_rate_projection.aggregate([ 
{ 
$match: { 
"registered_at": { $gte: ISODate("2015-11-21"), $lte: ISODate("2015-11-22") } 
} 
}, 
{ 
$group: { 
_id: { }, 
count: { $sum:1 } 
} 
} 
]);
The$aggrega(on$(2)$.$Users$with$a$purchase 
var purchased = db.users_conversion_rate_projection.aggregate([ 
{ 
$match: { 
"registered_at": { $gte: ISODate("2015-11-21"), $lte: ISODate("2015-11-22") }, 
"purchased_at": { $exists: true } 
} 
}, 
{ 
$group: { 
_id: { }, 
count: { $sum:1 } 
} 
} 
]);
The$aggrega(on$(3)$.$Automate$all$the$things 
• You%can%easily%create%the%aggrega2on%framework%statement%by% 
composi2on%abstrac2ng%the%concept%of%Column. 
• This%way%you%can%dynamically%aggregate%your%projec2ons%on%(for% 
example)%an%API%requests. 
• If%your%Projector%is%a%long%running%process,%your%projec2ons%will% 
be%updated%to%the%second%and%you%automagically%get%real%me% 
data.
Another(events(usage:(Business(&( 
Tech(Monitoring
Beware&of&the&beast! 
No#Silver#Bullet
Events'are'expensive 
Require'a'lot'of'TIME'to'be'parsed
Events'are'expensive 
You$will$end$up$with$this$billion$size$collec2on$ 
(and$coun2ng).
Fixing&wrong&events&is&painful
Events'are'complex
Moving'around'events'is'horribly' 
painful
Mongo%won't%help%you. 
Actually(it(will(make(your(life(incredibly( 
difficult(with(hidden(bugs(and(leaking( 
documenta8on.
Thank&you! 
@jnardiello

More Related Content

What's hot

Getting Started with MongoDB: 4 Application Designs
Getting Started with MongoDB: 4 Application DesignsGetting Started with MongoDB: 4 Application Designs
Getting Started with MongoDB: 4 Application DesignsDATAVERSITY
 
[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema
[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema
[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON SchemaMongoDB
 
Joins and Other MongoDB 3.2 Aggregation Enhancements
Joins and Other MongoDB 3.2 Aggregation EnhancementsJoins and Other MongoDB 3.2 Aggregation Enhancements
Joins and Other MongoDB 3.2 Aggregation EnhancementsAndrew Morgan
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB
 
A head start on cloud native event driven applications - bigdatadays
A head start on cloud native event driven applications - bigdatadaysA head start on cloud native event driven applications - bigdatadays
A head start on cloud native event driven applications - bigdatadaysSriskandarajah Suhothayan
 
Implementing and Visualizing Clickstream data with MongoDB
Implementing and Visualizing Clickstream data with MongoDBImplementing and Visualizing Clickstream data with MongoDB
Implementing and Visualizing Clickstream data with MongoDBMongoDB
 
Orion Context Broker 20190214
Orion Context Broker 20190214Orion Context Broker 20190214
Orion Context Broker 20190214Fermin Galan
 
MongoDB .local Toronto 2019: MongoDB Atlas Search Deep Dive
MongoDB .local Toronto 2019: MongoDB Atlas Search Deep DiveMongoDB .local Toronto 2019: MongoDB Atlas Search Deep Dive
MongoDB .local Toronto 2019: MongoDB Atlas Search Deep DiveMongoDB
 
MongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case Study
MongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case StudyMongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case Study
MongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case StudyMongoDB
 
Server Side Events
Server Side EventsServer Side Events
Server Side Eventsthepilif
 
Users as Data
Users as DataUsers as Data
Users as Datapdingles
 
It's a Dangerous World
It's a Dangerous World It's a Dangerous World
It's a Dangerous World MongoDB
 
Dropwizard with MongoDB and Google Cloud
Dropwizard with MongoDB and Google CloudDropwizard with MongoDB and Google Cloud
Dropwizard with MongoDB and Google CloudYun Zhi Lin
 
Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters MongoDB
 
Orion Context Broker 20210907
Orion Context Broker 20210907Orion Context Broker 20210907
Orion Context Broker 20210907Fermin Galan
 
A Free New World: Atlas Free Tier and How It Was Born
A Free New World: Atlas Free Tier and How It Was Born A Free New World: Atlas Free Tier and How It Was Born
A Free New World: Atlas Free Tier and How It Was Born MongoDB
 
Exploring Lightweight Event Sourcing - DUSE 2011-10-05
Exploring Lightweight Event Sourcing - DUSE 2011-10-05Exploring Lightweight Event Sourcing - DUSE 2011-10-05
Exploring Lightweight Event Sourcing - DUSE 2011-10-05Erik Rozendaal
 

What's hot (20)

Getting Started with MongoDB: 4 Application Designs
Getting Started with MongoDB: 4 Application DesignsGetting Started with MongoDB: 4 Application Designs
Getting Started with MongoDB: 4 Application Designs
 
[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema
[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema
[MongoDB.local Bengaluru 2018] Just in Time Validation with JSON Schema
 
Joins and Other MongoDB 3.2 Aggregation Enhancements
Joins and Other MongoDB 3.2 Aggregation EnhancementsJoins and Other MongoDB 3.2 Aggregation Enhancements
Joins and Other MongoDB 3.2 Aggregation Enhancements
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
Siddhi - cloud-native stream processor
Siddhi - cloud-native stream processorSiddhi - cloud-native stream processor
Siddhi - cloud-native stream processor
 
Html indexed db
Html indexed dbHtml indexed db
Html indexed db
 
A head start on cloud native event driven applications - bigdatadays
A head start on cloud native event driven applications - bigdatadaysA head start on cloud native event driven applications - bigdatadays
A head start on cloud native event driven applications - bigdatadays
 
Implementing and Visualizing Clickstream data with MongoDB
Implementing and Visualizing Clickstream data with MongoDBImplementing and Visualizing Clickstream data with MongoDB
Implementing and Visualizing Clickstream data with MongoDB
 
Orion Context Broker 20190214
Orion Context Broker 20190214Orion Context Broker 20190214
Orion Context Broker 20190214
 
MongoDB .local Toronto 2019: MongoDB Atlas Search Deep Dive
MongoDB .local Toronto 2019: MongoDB Atlas Search Deep DiveMongoDB .local Toronto 2019: MongoDB Atlas Search Deep Dive
MongoDB .local Toronto 2019: MongoDB Atlas Search Deep Dive
 
MongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case Study
MongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case StudyMongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case Study
MongoDB World 2018: Overnight to 60 Seconds: An IOT ETL Performance Case Study
 
Server Side Events
Server Side EventsServer Side Events
Server Side Events
 
Users as Data
Users as DataUsers as Data
Users as Data
 
It's a Dangerous World
It's a Dangerous World It's a Dangerous World
It's a Dangerous World
 
Dropwizard with MongoDB and Google Cloud
Dropwizard with MongoDB and Google CloudDropwizard with MongoDB and Google Cloud
Dropwizard with MongoDB and Google Cloud
 
Async
AsyncAsync
Async
 
Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters
 
Orion Context Broker 20210907
Orion Context Broker 20210907Orion Context Broker 20210907
Orion Context Broker 20210907
 
A Free New World: Atlas Free Tier and How It Was Born
A Free New World: Atlas Free Tier and How It Was Born A Free New World: Atlas Free Tier and How It Was Born
A Free New World: Atlas Free Tier and How It Was Born
 
Exploring Lightweight Event Sourcing - DUSE 2011-10-05
Exploring Lightweight Event Sourcing - DUSE 2011-10-05Exploring Lightweight Event Sourcing - DUSE 2011-10-05
Exploring Lightweight Event Sourcing - DUSE 2011-10-05
 

Similar to Eventsourcing with PHP and MongoDB

Beyond php it's not (just) about the code
Beyond php   it's not (just) about the codeBeyond php   it's not (just) about the code
Beyond php it's not (just) about the codeWim Godden
 
Web mapping with vector data. Is it the future ? 2012
Web mapping with vector data. Is it the future ? 2012Web mapping with vector data. Is it the future ? 2012
Web mapping with vector data. Is it the future ? 2012Moullet
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeWim Godden
 
Grokking Engineering - Data Analytics Infrastructure at Viki - Huy Nguyen
Grokking Engineering - Data Analytics Infrastructure at Viki - Huy NguyenGrokking Engineering - Data Analytics Infrastructure at Viki - Huy Nguyen
Grokking Engineering - Data Analytics Infrastructure at Viki - Huy NguyenHuy Nguyen
 
Beyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisBeyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisC4Media
 
Beyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeBeyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeWim Godden
 
A miało być tak... bez wycieków
A miało być tak... bez wyciekówA miało być tak... bez wycieków
A miało być tak... bez wyciekówKonrad Kokosa
 
Docker Logging and analysing with Elastic Stack - Jakub Hajek
Docker Logging and analysing with Elastic Stack - Jakub Hajek Docker Logging and analysing with Elastic Stack - Jakub Hajek
Docker Logging and analysing with Elastic Stack - Jakub Hajek PROIDEA
 
Docker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic StackDocker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic StackJakub Hajek
 
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Webbeyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than WebHeiko Behrens
 
Practical JSON in MySQL 5.7 and Beyond
Practical JSON in MySQL 5.7 and BeyondPractical JSON in MySQL 5.7 and Beyond
Practical JSON in MySQL 5.7 and BeyondIke Walker
 
JavaScript Libraries: The Big Picture
JavaScript Libraries: The Big PictureJavaScript Libraries: The Big Picture
JavaScript Libraries: The Big PictureSimon Willison
 
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache AirflowBusiness Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache AirflowRomain Dorgueil
 
Systems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteSystems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteDeepak Singh
 
Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...
Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...
Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...Skilld
 
The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...
The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...
The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...Thoughtworks
 
CQRS and Event Sourcing with MongoDB and PHP
CQRS and Event Sourcing with MongoDB and PHPCQRS and Event Sourcing with MongoDB and PHP
CQRS and Event Sourcing with MongoDB and PHPDavide Bellettini
 

Similar to Eventsourcing with PHP and MongoDB (20)

Node azure
Node azureNode azure
Node azure
 
Beyond php it's not (just) about the code
Beyond php   it's not (just) about the codeBeyond php   it's not (just) about the code
Beyond php it's not (just) about the code
 
Web mapping with vector data. Is it the future ? 2012
Web mapping with vector data. Is it the future ? 2012Web mapping with vector data. Is it the future ? 2012
Web mapping with vector data. Is it the future ? 2012
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
 
Grokking Engineering - Data Analytics Infrastructure at Viki - Huy Nguyen
Grokking Engineering - Data Analytics Infrastructure at Viki - Huy NguyenGrokking Engineering - Data Analytics Infrastructure at Viki - Huy Nguyen
Grokking Engineering - Data Analytics Infrastructure at Viki - Huy Nguyen
 
Beyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisBeyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic Analysis
 
Beyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeBeyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the code
 
A miało być tak... bez wycieków
A miało być tak... bez wyciekówA miało być tak... bez wycieków
A miało być tak... bez wycieków
 
Docker Logging and analysing with Elastic Stack - Jakub Hajek
Docker Logging and analysing with Elastic Stack - Jakub Hajek Docker Logging and analysing with Elastic Stack - Jakub Hajek
Docker Logging and analysing with Elastic Stack - Jakub Hajek
 
Docker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic StackDocker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic Stack
 
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Webbeyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
beyond tellerrand: Mobile Apps with JavaScript – There's More Than Web
 
Practical JSON in MySQL 5.7 and Beyond
Practical JSON in MySQL 5.7 and BeyondPractical JSON in MySQL 5.7 and Beyond
Practical JSON in MySQL 5.7 and Beyond
 
NodeJS for Beginner
NodeJS for BeginnerNodeJS for Beginner
NodeJS for Beginner
 
JavaScript Libraries: The Big Picture
JavaScript Libraries: The Big PictureJavaScript Libraries: The Big Picture
JavaScript Libraries: The Big Picture
 
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache AirflowBusiness Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
 
Systems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteSystems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop Keynote
 
Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...
Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...
Build tons of multi-device JavaScript applications - Part 1 : Boilerplate, de...
 
The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...
The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...
The Enterprise Architecture you always wanted: A Billion Transactions Per Mon...
 
Profiling for Grown-Ups
Profiling for Grown-UpsProfiling for Grown-Ups
Profiling for Grown-Ups
 
CQRS and Event Sourcing with MongoDB and PHP
CQRS and Event Sourcing with MongoDB and PHPCQRS and Event Sourcing with MongoDB and PHP
CQRS and Event Sourcing with MongoDB and PHP
 

More from Jacopo Nardiello

The Art of Cloud Native Defense on Kubernetes
The Art of Cloud Native Defense on KubernetesThe Art of Cloud Native Defense on Kubernetes
The Art of Cloud Native Defense on KubernetesJacopo Nardiello
 
Tales of the mythical cloud-native platform - Container day 2022
Tales of the mythical cloud-native platform - Container day 2022Tales of the mythical cloud-native platform - Container day 2022
Tales of the mythical cloud-native platform - Container day 2022Jacopo Nardiello
 
Monitoring Cloud Native Applications with Prometheus
Monitoring Cloud Native Applications with PrometheusMonitoring Cloud Native Applications with Prometheus
Monitoring Cloud Native Applications with PrometheusJacopo Nardiello
 
Ultimate Introduction To AngularJS
Ultimate Introduction To AngularJSUltimate Introduction To AngularJS
Ultimate Introduction To AngularJSJacopo Nardiello
 

More from Jacopo Nardiello (8)

The Art of Cloud Native Defense on Kubernetes
The Art of Cloud Native Defense on KubernetesThe Art of Cloud Native Defense on Kubernetes
The Art of Cloud Native Defense on Kubernetes
 
Tales of the mythical cloud-native platform - Container day 2022
Tales of the mythical cloud-native platform - Container day 2022Tales of the mythical cloud-native platform - Container day 2022
Tales of the mythical cloud-native platform - Container day 2022
 
Breaking the monolith
Breaking the monolithBreaking the monolith
Breaking the monolith
 
Monitoring Cloud Native Applications with Prometheus
Monitoring Cloud Native Applications with PrometheusMonitoring Cloud Native Applications with Prometheus
Monitoring Cloud Native Applications with Prometheus
 
Kubernetes 101
Kubernetes 101Kubernetes 101
Kubernetes 101
 
Becoming a developer
Becoming a developerBecoming a developer
Becoming a developer
 
Ultimate Introduction To AngularJS
Ultimate Introduction To AngularJSUltimate Introduction To AngularJS
Ultimate Introduction To AngularJS
 
Testing AngularJS
Testing AngularJSTesting AngularJS
Testing AngularJS
 

Recently uploaded

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2
 
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...WSO2
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAMWSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAMWSO2
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2
 

Recently uploaded (20)

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAMWSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
 

Eventsourcing with PHP and MongoDB