SlideShare une entreprise Scribd logo
1  sur  191
Télécharger pour lire hors ligne
#MDBW17
Nathaniel May Consulting Engineer, MongoDB
FAULT TOLERANT APPLICATIONS
@codenoodle
#MDBW17
EXAMPLES ARE FROM REAL BUSINESSES
#MDBW17
"SERVERS ARE RANDOMLY CRASHING"
#MDBW17
"SERVERS ARE RANDOMLY CRASHING"
#MDBW17
"SERVERS ARE RANDOMLY CRASHING"
#MDBW17
"SERVERS ARE RANDOMLY CRASHING"
#MDBW17
"SERVERS ARE RANDOMLY CRASHING"
#MDBW17
"SERVERS ARE RANDOMLY CRASHING"
#MDBW17
TOPICS
#MDBW17
TOPICS
#MDBW17
TOPICS
#MDBW17
TOPICS
1
#MDBW17
JACK'S SERVERS
#MDBW17
NORMAL LOAD
#MDBW17
NORMAL LOAD
#MDBW17
NORMAL LOAD
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
OVERLOADING SECONDARIES
#MDBW17
SCALING
#MDBW17
SHARDED CLUSTER
#MDBW17
SHARDED CLUSTER
#MDBW17
SHARDED CLUSTER
#MDBW17
TAKEAWAY
#MDBW17
SLOW QUERIES & TIMEOUTS
#MDBW17
SOCKET TIMEOUT
#MDBW17
SOCKET TIMEOUT
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
#MDBW17
SOCKET TIMEOUT
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
#MDBW17
SOCKET TIMEOUT
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
#MDBW17
SOCKET TIMEOUT WITH MAXTIMEMS
#MDBW17
SOCKET TIMEOUT WITHOUT MAXTIMEMS
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
MAXTIMEMS
NO WASTED RESOURCES
#MDBW17
SOCKET TIMEOUT WITHOUT MAXTIMEMS
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
NO WASTED RESOURCES
#MDBW17
SOCKET TIMEOUT WITHOUT MAXTIMEMS
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
MAXTIMEMS
NO WASTED RESOURCES
#MDBW17
SOCKET TIMEOUT WITHOUT MAXTIMEMS
BROKEN SOCKET
SOCKET TIMEOUT
result set
poorly formed query
MAXTIMEMS
NO WASTED RESOURCES
#MDBW17
POORLY FORMED QUERIES
#MDBW17
POORLY FORMED QUERIES
db.col.find(…).explain("executionStats")
#MDBW17
TAKEAWAY
#MDBW17
SAFELY RETRYABLE OPERATIONS
1
#MDBW17
WHAT KIND OF FAULTS ARE WE TOLERATING?
Primary Failover Network Blip Network Down
#MDBW17
…AND THE DEVELOPER’S FAULT
#MDBW17
WHAT KIND OF FAULTS ARE WE TOLERATING?
Primary Failover Network Blip Network Down
#MDBW17
WHAT KIND OF FAULTS ARE WE TOLERATING?
Network Error Network Blip Network Down
#MDBW17
WHAT KIND OF FAULTS ARE WE TOLERATING?
Network Error Network Error Network Down
#MDBW17
WHAT KIND OF FAULTS ARE WE TOLERATING?
Network Error Network Error Network Error
#MDBW17
DRIVER BEHAVIOR AFTER NETWORK ERROR
#MDBW17
DRIVER BEHAVIOR AFTER NETWORK ERROR
NO PRIMARY
{operation}
{app retry}
{auto discovery}
{auto discovery}
NO PRIMARY
NO PRIMARY
PRIMARY
#MDBW17
DRIVER BEHAVIOR AFTER NETWORK ERROR
NO PRIMARY
{operation}
{app retry}
{auto discovery}
{auto discovery}
NO PRIMARY
NO PRIMARY
PRIMARY
#MDBW17
DRIVER BEHAVIOR AFTER NETWORK ERROR
NO PRIMARY
{operation}
{app retry}
{auto discovery}
{auto discovery}
NO PRIMARY
NO PRIMARY
PRIMARY
#MDBW17
DRIVER BEHAVIOR AFTER NETWORK ERROR
NO PRIMARY
{operation}
{app retry}
{auto discovery}
{auto discovery}
NO PRIMARY
NO PRIMARY
PRIMARY
#MDBW17
RETRY STRATEGIES
#MDBW17
RETRY STRATEGIES
DON'T RETRY
#MDBW17
RETRY STRATEGIES
DON'T RETRY
RETRY N TIMES
#MDBW17
RETRY STRATEGIES
DON'T RETRY
RETRY N TIMES
EXPONENTIAL BACKOFF
#MDBW17
RETRY STRATEGIES
DON'T RETRY
RETRY N TIMES
EXPONENTIAL BACKOFF
RETRY EXACTLY ONCE
#MDBW17
RETRY STRATEGIES
DON'T RETRY
RETRY N TIMES
EXPONENTIAL BACKOFF
RETRY EXACTLY ONCE
#MDBW17
RETRY EXACTLY ONCE
Query
Insert
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
READ PREFERENCE
#MDBW17
READ PREFERENCE
PRIMARY PREFERRED
#MDBW17
READ PREFERENCE
PRIMARY PREFERRED
#MDBW17
READ PREFERENCE
PRIMARY PREFERRED
#MDBW17
READ PREFERENCE
PRIMARY PREFERRED
#MDBW17
READ PREFERENCE
PRIMARY PREFERRED
#MDBW17
READ PREFERENCE
PRIMARY
#MDBW17
READ PREFERENCE
PRIMARY
#MDBW17
READ PREFERENCE
PRIMARY
#MDBW17
READ PREFERENCE
PRIMARY
#MDBW17
READ PREFERENCE
PRIMARY
#MDBW17
RETRY EXACTLY ONCE
Query
Insert
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT
Insert
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT
Insert
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
INSERT
{name: "MongoDB"}
{name: "MongoDB"} {_id: ObjectId(),
name: "MongoDB"}
SOCKET TIMEOUT
BLIP
SINGLE INSERT
#MDBW17
INSERT
{name: "MongoDB"}
{name: "MongoDB"} {_id: ObjectId(),
name: "MongoDB"}
SOCKET TIMEOUT
BLIP
SINGLE INSERT
#MDBW17
INSERT
{name: "MongoDB"}
{name: "MongoDB"} {_id: ObjectId(),
name: "MongoDB"}
SOCKET TIMEOUT
BLIP
SINGLE INSERT
#MDBW17
INSERT
{name: "MongoDB"}
{name: "MongoDB"} {_id: ObjectId(),
name: "MongoDB"}
SOCKET TIMEOUT
BLIP
SINGLE INSERT
#MDBW17
INSERT
#MDBW17
INSERT
BLIP
SOCKET TIMEOUT
{name: "MongoDB"}
{name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
#MDBW17
INSERT
BLIP
SOCKET TIMEOUT
{name: "MongoDB"}
{name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
#MDBW17
INSERT
BLIP
SOCKET TIMEOUT
{name: "MongoDB"}
{name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
#MDBW17
INSERT
BLIP
SOCKET TIMEOUT
{name: "MongoDB"}
{name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
#MDBW17
INSERT
BLIP
SOCKET TIMEOUT
{name: "MongoDB"}
{name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
{_id: ObjectId(),
name: "MongoDB"}
DUPLICATEDATA
#MDBW17
INSERT WITH _ID
#MDBW17
INSERT WITH _ID
BLIP
SOCKET TIMEOUT
{_id: 1, name: "MongoDB"}
{_id: 1, name: "MongoDB"}
{_id: 1,
name: "MongoDB"}
DUPLICATEKEY ERROR – SINGLE INSERT
#MDBW17
INSERT WITH _ID
BLIP
SOCKET TIMEOUT
{_id: 1, name: "MongoDB"}
{_id: 1, name: "MongoDB"}
{_id: 1,
name: "MongoDB"}
DUPLICATEKEY ERROR – SINGLE INSERT
#MDBW17
INSERT WITH _ID
BLIP
SOCKET TIMEOUT
{_id: 1, name: "MongoDB"}
{_id: 1, name: "MongoDB"}
{_id: 1,
name: "MongoDB"}
DUPLICATEKEY ERROR – SINGLE INSERT
#MDBW17
INSERT WITH _ID
BLIP
SOCKET TIMEOUT
{_id: 1, name: "MongoDB"}
{_id: 1, name: "MongoDB"}
{_id: 1,
name: "MongoDB"}
DUPLICATEKEY ERROR – SINGLE INSERT
#MDBW17
INSERT WITH _ID
BLIP
SOCKET TIMEOUT
{_id: 1, name: "MongoDB"}
{_id: 1, name: "MongoDB"}
{_id: 1,
name: "MongoDB"}
DUPLICATEKEY ERROR – SINGLE INSERT
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
REMOVE
#MDBW17
REMOVE
deleteOne ({a:1})
#MDBW17
REMOVE
deleteOne ({a:1})
deleteMany({a:1})
#MDBW17
REMOVE
deleteOne ({a:1})
deleteMany({a:1})
#MDBW17
REMOVE
deleteOne ({a:1})
deleteMany({a:1})
deleteMany({ts: {$lt: today_midnight}})
#MDBW17
REMOVE
deleteOne ({a:1})
deleteMany({a:1})
deleteMany({ts: {$lt: today_midnight}})
deleteOne ({_id: 1})
#MDBW17
REMOVE
deleteOne ({a:1})
deleteMany({a:1})
deleteMany({ts: {$lt: today_midnight}})
deleteOne ({_id: 1})
deleteMany({_id: {$in: [1, 2, 3]}})
#MDBW17
REMOVE
deleteOne ({a:1})
deleteMany({a:1})
deleteMany({ts: {$lt: today_midnight}})
deleteOne ({_id: 1})
deleteMany({_id: {$in: [1, 2, 3]}})
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove CORRECT
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove CORRECT CORRECT
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove CORRECT CORRECT CORRECT
Update
Operations Primary Failover Network Blip Network Down
#MDBW17
UPDATE
#MDBW17
UPDATE
{$inc: {count: 1}}
{$inc: {count: 1}}
SOCKET TIMEOUT
BLIP
CORRECT COUNT
{_id: 1, count: 1}
{_id: 1, count: 1}
{_id: 1, count: 2}
#MDBW17
UPDATE
{$inc: {count: 1}}
{$inc: {count: 1}}
SOCKET TIMEOUT
BLIP
CORRECT COUNT
{_id: 1, count: 1}
{_id: 1, count: 1}
{_id: 1, count: 2}
#MDBW17
UPDATE
{$inc: {count: 1}}
{$inc: {count: 1}}
SOCKET TIMEOUT
BLIP {_id: 1, count: 1}
{_id: 1, count: 1}
{_id: 1, count: 2}
#MDBW17
UPDATE
{$inc: {count: 1}}
{$inc: {count: 1}}
SOCKET TIMEOUT
BLIP
CORRECT COUNT
{_id: 1, count: 1}
{_id: 1, count: 1}
{_id: 1, count: 2}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove CORRECT CORRECT CORRECT
Update OVER COUNT?
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove CORRECT CORRECT CORRECT
Update OVER COUNT? OVER COUNT?
Operations Primary Failover Network Blip Network Down
#MDBW17
RETRY EXACTLY ONCE
Query CORRECT CORRECT CORRECT
Insert CORRECT CORRECT CORRECT
Remove CORRECT CORRECT CORRECT
Update OVER COUNT? OVER COUNT? CORRECT
Operations Primary Failover Network Blip Network Down
#MDBW17
TRANSACTIONS
#MDBW17
IDEMPOTENT OPERATIONS
1
#MDBW17
NOT IDEMPOTENT
#MDBW17
NOT IDEMPOTENT
6 cards
#MDBW17
NOT IDEMPOTENT
Discard 2 cards
#MDBW17
NOT IDEMPOTENT
#MDBW17
NOT IDEMPOTENT
Discard 2 cards
#MDBW17
NOT IDEMPOTENT
#MDBW17
NOT IDEMPOTENT
Discard 2 cards
#MDBW17
NOT IDEMPOTENT
#MDBW17
NOT IDEMPOTENT
The number of cards changed every time
#MDBW17
IDEMPOTENT
#MDBW17
IDEMPOTENT
#MDBW17
IDEMPOTENT
6 cards
#MDBW17
IDEMPOTENT
Discard down to 4 cards
#MDBW17
IDEMPOTENT
#MDBW17
IDEMPOTENT
Discard down to 4 cards
#MDBW17
IDEMPOTENT
4 cards
#MDBW17
IDEMPOTENT
The number of cards only changed once
#MDBW17
IDEMPOTENT
The number of cards only changed once
1
#MDBW17
THE IDEMPOTENT UPDATE
#MDBW17
THE IDEMPOTENT UPDATE
opid = new ObjectId();
db.col.updateOne(
{_id: ObjectId("…"),
update_ops: {$ne: opid}
},
{$inc: {count: 1},
$push: {update_ops: opid}
}
);
#MDBW17
THE IDEMPOTENT UPDATE
opid = new ObjectId();
db.col.updateOne(
{_id: ObjectId("…"),
update_ops: {$ne: opid}
},
{$inc: {count: 1},
$push: {update_ops: opid}
}
);
#MDBW17
OBJECTID( )
ObjectId("507f1f77bcf86cd799439011")
#MDBW17
OBJECTID( )
ObjectId("XXXXXXXXXXXXXXXXXXXXXXXX")
#MDBW17
OBJECTID( )
ObjectId("507f1f77XXXXXXXXXXXXXXXX")
4 bytes – seconds since Unix epoch
#MDBW17
OBJECTID( )
ObjectId("507f1f77bcf86cXXXXXXXXXX")
4 bytes – seconds since Unix epoch
3 bytes – hashed machine identifier
#MDBW17
OBJECTID( )
ObjectId("507f1f77bcf86cd799XXXXXX")
4 bytes – seconds since Unix epoch
3 bytes – hashed machine identifier
2 bytes – hashed process id
#MDBW17
OBJECTID( )
ObjectId("507f1f77bcf86cd799439011")
4 bytes – seconds since Unix epoch
3 bytes – hashed machine identifier
2 bytes – hashed process id
3 bytes – counter
#MDBW17
THE IDEMPOTENT UPDATE
opid = new ObjectId();
db.col.updateOne(
{_id: "…",
update_ops: {$ne: opid}
},
{$inc: {count: 1},
$push: {update_ops: opid}
}
);
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 1
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 1
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 1
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 1
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 1
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 2,
update_ops: [
ObjectId("x")
]
}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
UPDATE
BLIP
SOCKET TIMEOUT
{$inc: {count: 1}}
OVER COUNT!
{$inc: {count: 1}}
{_id: 1, count: 1}
{_id: 1, count: 2}
{_id: 1, count: 2}
{_id: 1, count: 3}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 2,
update_ops: [
ObjectId("x")
]
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 2,
update_ops: [
ObjectId("x")
]
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 2,
update_ops: [
ObjectId("x")
]
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 2,
update_ops: [
ObjectId("x")
]
}
#MDBW17
THE IDEMPOTENT UPDATE
TRY:
opid = new ObjectId();
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
CATCH:
db.col.updateOne(
{_id: "ABC",
update_ops: {$ne: opid}},
{$inc: {count: 1},
$push: {update_ops: opid}});
{
_id: "ABC",
count: 2,
update_ops: [
ObjectId("x")
]
}
#MDBW17
CLEANUP
#MDBW17
CLEANUP
{
_id: "ABC",
count: 3,
update_ops: [
ObjectId("…"), ObjectId("…")
]
}
#MDBW17
CLEANUP
{
_id: "ABC",
count: 4,
update_ops: [
ObjectId("…"), ObjectId("…"),
ObjectId("…")
]
}
#MDBW17
CLEANUP
{
_id: "ABC",
count: 5,
update_ops: [
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…")
]
}
#MDBW17
CLEANUP
{
_id: "ABC",
count: 6,
update_ops: [
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…")
]
}
#MDBW17
CLEANUP
{
_id: "ABC",
count: 7,
update_ops: [
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…")
]
}
#MDBW17
CLEANUP
{
_id: "ABC",
count: 9,
update_ops: [
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…")
]
}
#MDBW17
CLEANUP
{
_id: "ABC",
count: 13,
update_ops: [
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…"),
ObjectId("…"), ObjectId("…")
]
}
#MDBW17
CLEANUP
#MDBW17
CLEANUP
IMMEDIATE SECOND UPDATE
#MDBW17
CLEANUP
IMMEDIATE SECOND UPDATE
ASYNCRONOUS BATCH PROCESS
#MDBW17
CLEANUP
IMMEDIATE SECOND UPDATE
ASYNCRONOUS BATCH PROCESS
TAIL THE OPLOG
#MDBW17
CLEANUP
IMMEDIATE SECOND UPDATE
ASYNCRONOUS BATCH PROCESS
TAIL THE OPLOG
$SLICE DURING UPDATE
#MDBW17
CLEANUP
IMMEDIATE SECOND UPDATE
ASYNCRONOUS BATCH PROCESS
TAIL THE OPLOG
$SLICE DURING UPDATE
#MDBW17
CLEANUP WITH $SLICE
opid = new ObjectId();
db.col.updateOne(
{_id: ObjectId("…"),
update_ops: {$ne: opid}
},
{$inc: {count: 1},
$push: {update_ops:
{$each: [opid],
$slice: -10
}}}
);
#MDBW17
CLEANUP WITH $SLICE
opid = new ObjectId();
db.col.updateOne(
{_id: ObjectId("…"),
update_ops: {$ne: opid}
},
{$inc: {count: 1},
$push: {update_ops:
{$each: [opid],
$slice: -10
}}}
);
#MDBW17
TAKEAWAYS
#MDBW17
TAKEAWAYS
#MDBW17
TAKEAWAYS
#MDBW17
TAKEAWAYS
1
Nathaniel May @codenoodle

Contenu connexe

Similaire à Building Fault Tolerant Applications.pdf

Be Mean To Your Code: Rugged Development & You
Be Mean To Your Code: Rugged Development & YouBe Mean To Your Code: Rugged Development & You
Be Mean To Your Code: Rugged Development & YouJames Wickett
 
Mongodbworkshop I: get started
Mongodbworkshop I: get startedMongodbworkshop I: get started
Mongodbworkshop I: get startedVivian S. Zhang
 
WordCamp Cologne - WordPress auf SPEED
WordCamp Cologne - WordPress auf SPEEDWordCamp Cologne - WordPress auf SPEED
WordCamp Cologne - WordPress auf SPEEDJan Löffler
 
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
 
Managing Cloud Security Design and Implementation in a Ransomware World
Managing Cloud Security Design and Implementation in a Ransomware WorldManaging Cloud Security Design and Implementation in a Ransomware World
Managing Cloud Security Design and Implementation in a Ransomware WorldMongoDB
 
[MongoDB.local Bengaluru 2018] Keynote
[MongoDB.local Bengaluru 2018] Keynote[MongoDB.local Bengaluru 2018] Keynote
[MongoDB.local Bengaluru 2018] KeynoteMongoDB
 
Common Cluster Configuration Pitfalls
Common Cluster Configuration PitfallsCommon Cluster Configuration Pitfalls
Common Cluster Configuration PitfallsMongoDB
 
Introducing Stitch
Introducing Stitch Introducing Stitch
Introducing Stitch MongoDB
 
Deciphering Explain Output
Deciphering Explain Output Deciphering Explain Output
Deciphering Explain Output MongoDB
 
(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014
(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014
(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014Amazon Web Services
 
"Giving the bad guys no sleep"
"Giving the bad guys no sleep""Giving the bad guys no sleep"
"Giving the bad guys no sleep"Christiaan Beek
 
Structured Data Implementation, MREIDs, and More at SMX Advanced 2018
Structured Data Implementation, MREIDs, and More at SMX Advanced 2018Structured Data Implementation, MREIDs, and More at SMX Advanced 2018
Structured Data Implementation, MREIDs, and More at SMX Advanced 2018Mike Arnesen
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBen Limmer
 
Introduction to cassandra 2014
Introduction to cassandra 2014Introduction to cassandra 2014
Introduction to cassandra 2014Patrick McFadin
 
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
 
MongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQL
MongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQLMongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQL
MongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQLMongoDB
 
Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...
Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...
Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...HostedbyConfluent
 
MongoDB on AWS in 5 min
MongoDB on AWS in 5 minMongoDB on AWS in 5 min
MongoDB on AWS in 5 minDavid Turner
 
2016 Local SEO Ranking Factors
2016 Local SEO Ranking Factors 2016 Local SEO Ranking Factors
2016 Local SEO Ranking Factors Daniel Leibson
 

Similaire à Building Fault Tolerant Applications.pdf (20)

Be Mean To Your Code: Rugged Development & You
Be Mean To Your Code: Rugged Development & YouBe Mean To Your Code: Rugged Development & You
Be Mean To Your Code: Rugged Development & You
 
Mongodbworkshop I: get started
Mongodbworkshop I: get startedMongodbworkshop I: get started
Mongodbworkshop I: get started
 
MongoDB Workshop
MongoDB WorkshopMongoDB Workshop
MongoDB Workshop
 
WordCamp Cologne - WordPress auf SPEED
WordCamp Cologne - WordPress auf SPEEDWordCamp Cologne - WordPress auf SPEED
WordCamp Cologne - WordPress auf SPEED
 
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
 
Managing Cloud Security Design and Implementation in a Ransomware World
Managing Cloud Security Design and Implementation in a Ransomware WorldManaging Cloud Security Design and Implementation in a Ransomware World
Managing Cloud Security Design and Implementation in a Ransomware World
 
[MongoDB.local Bengaluru 2018] Keynote
[MongoDB.local Bengaluru 2018] Keynote[MongoDB.local Bengaluru 2018] Keynote
[MongoDB.local Bengaluru 2018] Keynote
 
Common Cluster Configuration Pitfalls
Common Cluster Configuration PitfallsCommon Cluster Configuration Pitfalls
Common Cluster Configuration Pitfalls
 
Introducing Stitch
Introducing Stitch Introducing Stitch
Introducing Stitch
 
Deciphering Explain Output
Deciphering Explain Output Deciphering Explain Output
Deciphering Explain Output
 
(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014
(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014
(GAM304) How Riot Games re:Invented Their AWS Model | AWS re:Invent 2014
 
"Giving the bad guys no sleep"
"Giving the bad guys no sleep""Giving the bad guys no sleep"
"Giving the bad guys no sleep"
 
Structured Data Implementation, MREIDs, and More at SMX Advanced 2018
Structured Data Implementation, MREIDs, and More at SMX Advanced 2018Structured Data Implementation, MREIDs, and More at SMX Advanced 2018
Structured Data Implementation, MREIDs, and More at SMX Advanced 2018
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profit
 
Introduction to cassandra 2014
Introduction to cassandra 2014Introduction to cassandra 2014
Introduction to cassandra 2014
 
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
 
MongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQL
MongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQLMongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQL
MongoDB .local London 2019: Managing Diverse User Needs with MongoDB and SQL
 
Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...
Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...
Change Data Capture Pipelines with Debezium and Kafka Streams (Gunnar Morling...
 
MongoDB on AWS in 5 min
MongoDB on AWS in 5 minMongoDB on AWS in 5 min
MongoDB on AWS in 5 min
 
2016 Local SEO Ranking Factors
2016 Local SEO Ranking Factors 2016 Local SEO Ranking Factors
2016 Local SEO Ranking Factors
 

Plus de MongoDB

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump StartMongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
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
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB
 

Plus de MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
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
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Building Fault Tolerant Applications.pdf