SlideShare a Scribd company logo
1 of 44
© 2018 AO World All Rights Reserved
Streaming data pipelines
with MongoDB and Kafka
Jon Vines, Software Engineer and Team Lead
• Jon Vines
• Software Engineer and Team Lead @ AO.com
• Get in touch:
• jonvines
• @_jonvines
• Loves reading, recommends:
Our
Approach
Our
Challenge
Data Driven
Applications
The Future
Data's
hidden
value
What is
Single
Customer
View?
A single customer view is an aggregated,
consistent and holistic representation of the data
held by an organisation about its customers that
can be viewed in one place, such as a single
page.
Wikipedia [https://en.wikipedia.org/wiki/Single_customer_view]
Get data
whilst it’s
hot
Why ?
SKETCH ONLY
SKETCH ONLY
{
"name" : "mongodb_europe_sql_connector",
"config" : {
"connector.class" : "io.confluent.connect.cdc.mssql.MsSqlSourceConnector",
"tasks.max" : "1",
"initial.database" : "MongoDBEurope2018",
"username" : "cdc",
"password" : "testing",
"server.name" : "sqlserver",
"server.port" : "1433",
"change.tracking.tables" : "dbo.tbl_Customer"
}
}
Kafka Connect SQL CDC
~/kafka$ bin/kafka-topics.sh --list --zookeeper zookeeper:2181/kafka
cdc.MongoDBEurope18.tbl_Customer
cdc.MongoDBEurope18.tbl_Order
~/kafka$
Viewing Kafka Topics
~/kafka$ bin/kafka-console-consumer.sh --bootstrap-server k1:9092 --topic cdc.MongoDBEurope18.tbl_Customer
--from-beginning
(sys_Change_operation|Mr Jon Vinesjon.vines@ao.comsys_change_creation_version 11862sys_change_version 11862
(sys_Change_operation|Mr Jonathan Vinesjon.vines@ao.comsys_change_creation_version 11874sys_change_version 11874
~/kafka$
Viewing Kafka Topics
{
"type": "record",
"name": "tbl_Customer",
"fields": [{
"name": "customerId",
"type": "int"
},
{
"name": "customerTitle",
"type": "string"
},
{
"name": "customerFirstName",
"type": "string"
},
{
"name": "customerSurname",
"type": "string"
},
{}
]
}
AVRO Serialisation
public void ConsumeMessages(string brokerList, IEnumerable<string> topics)
{
using (var consumer = new Consumer<byte[], byte[]>(ConstructConfig(brokerList, true),
new ByteArrayDeserializer(), new ByteArrayDeserializer()))
{
consumer.OnMessage += (_, message) => MessageReceived(message);
consumer.Subscribe(topics);
while (_consumeMessages)
{
consumer.Poll(TimeSpan.FromMilliseconds(100));
}
}
}
Consuming Kafka Messages
private void MessageReceived(Message<byte[], byte[]> message)
{
try
{
_processorStrategy.ProcessMessage(message.Topic, message);
}
catch (Exception exception)
{
throw;
}
}
Consuming Kafka Messages
public void ProcessMessage(Message<byte[], byte[]> message)
{
var cdcCustomer = _messageDeserializer.DeserializeMessage(message);
var customer = _scvCustomer.Add(cdcCustomer);
_customerRepository.Save(customer);
}
Processing Kafka Messages
{
"_id": "5af45b47db610c0001e222c1",
"scvId": "xLOuIoVo20uDMh1g+Y7gsQ==",
"customerSummaries": [
{
"firstName": "Jon",
"surname": "Vines",
"title": "Mr",
"landlineNumber": "01234125112"
}
],
"orders": [
{
"orderNumber": "SCV201415081",
"orderDate": "2018-10-15 17:31:02.000Z,
"orderTotal": 329.00
}
],
"lastActivity": "2018-06-15T10:00:47.470Z",
"addedDate": "2018-04-10T16:05:13.000Z",
"emailAddress": "jon.vines@ao.com",
"versionNumber": 12
}
Building up documents
...
"customerSummaries": [
{
"firstName": "Jon",
"surname": "Vines",
"title": "Mr",
"landlineNumber": "01234125112"
},
{
"firstName": "Jonathan",
"surname": "Vines",
"title": "Mr",
"landlineNumber": "01234125112"
}
],
"orders": [
{
"orderNumber": "SCV201415081",
"orderDate": "2018-10-15 17:31:02.000Z",
"orderTotal": 329.00
},
{
"orderNumber": "SCV201417812",
"orderDate": "2018-10-15 17:31:02.000Z",
"orderTotal": 329.00
}
]
...
Building up documents
{
"name" : "mongodb_europe_oplog_connector",
"config" : {
"connector.class" : "io.debezium.connector.mongodb.MongoDbConnector",
"mongodb.hosts" : "rs0/192.168.99.27017",
"mongodb.name" : "SCV",
"collection.whitelist" : "SCV_Customer[.]*"
}
}
Kafka Connect MongoDB OpLog
Lessons learned
Generating batches
private void GenerateBatchJobs(int? firstEntityId, int lastEntityId, int maxBatchesGenerated)
{
var isFirstEntityIdProcessed = false;
var numberOfBatchesGenerated = 0;
_currentJobId = Guid.NewGuid();
while (!isFirstEntityIdProcessed && numberOfBatchesGenerated != maxBatchesGenerated)
{
var firstEntityIdOfBatch = lastEntityId;
var aoEntityBatch = _repository.Find(_limit, firstEntityIdOfBatch, _fieldName).ToList();
ProcessEntityBatch(aoEntityBatch);
lastEntityId = aoEntityBatch.Last().GetEntityId();
if (aoEntityBatch.Any(x => x.GetEntityId() == firstEntityId))
{
isFirstEntityIdProcessed = true;
}
lastEntityId--;
numberOfBatchesGenerated++;
}
}
MongoDB
Lessons
Use .explain()
public IEnumerable<T> Find(Expression<Func<T, bool>> expression, Expression<Func<T, int>> sortExpression,
int limit, string hint)
{
return _database
.GetCollection<T>(_collectionName)
.AsQueryable(new AggregateOptions() { Hint = new BsonDocument(hint, 1) })
.Where(expression)
.OrderBy(sortExpression)
.Take(limit);
}
...
db.order
.explain('executionStats')
.aggregate([
{ $match: { numberOfTimesProcessed: { $lt: 3 }, Id: { $gte: 19020680 } } },
{ $sort: { salesOrderId: 1 } },
{ $limit: 50 }
],
{hint: { Id: 1 }});
public IEnumerable<T> Find(string fieldName, int entityId, int maxNumberOfTimesProcessed, int limitToReturn)
{
var filter = new BsonDocument
{
{ Numberoftimesprocessed, new BsonDocument("$lt", maxNumberOfTimesProcessed) },
{ fieldName, new BsonDocument("$gte", entityId) }
};
var sort = new BsonDocument(fieldName, 1);
IAsyncCursor<T> query = _database.GetCollection<T>(_collectionName).Find(filter).Sort(sort)
.Limit(limitToReturn).ToCursor();
return query.ToList();
}
Use native query language
Use _id when possible
Watch for unbounded document growth
Lambda + VPC Peering + MongoDB Atlas
= Cold Starts
Cache your database object in your
lambdas
public LambdaConstructor()
{
var secretManager = new SecretManager(new ConfigurationManager());
var mongoDb =
JsonConvert.DeserializeObject<MongoConnectionString>(
secretManager.Get(Environment.GetEnvironmentVariable("SECRET_NAME")));
var mongoClient = new MongoClient(mongoDb.ConnectionString);
var mongoDatabase =
mongoClient.GetDatabase(Environment.GetEnvironmentVariable("MONGODB_GDPR_SUPPRESSION_COLLECTION"));
var pack = new ConventionPack {new CamelCaseElementNameConvention(), new IgnoreIfNullConvention(true)};
ConventionRegistry.Register("camel case",
pack,
t => true);
}
MongoDB once in Lambda
Serverless development with Node.js, AWS Lambda and MongoDB Atlas
https://bit.ly/2HrOGYX
Data access in Serverless architectures
People
And
culture
Are you ?

More Related Content

What's hot

[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
 
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
 
Tutorial: Building Your First App with MongoDB Stitch
Tutorial: Building Your First App with MongoDB StitchTutorial: Building Your First App with MongoDB Stitch
Tutorial: Building Your First App with MongoDB StitchMongoDB
 
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 .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB
 
MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...
MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...
MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...MongoDB
 
Jsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSONJsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSONorless
 
Schema Design Best Practices with Buzz Moschetti
Schema Design Best Practices with Buzz MoschettiSchema Design Best Practices with Buzz Moschetti
Schema Design Best Practices with Buzz MoschettiMongoDB
 
Microsoft Web Matrix
Microsoft Web MatrixMicrosoft Web Matrix
Microsoft Web MatrixSaurabh Moody
 
Deciphering Explain Output
Deciphering Explain Output Deciphering Explain Output
Deciphering Explain Output 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
 
Map/Confused? A practical approach to Map/Reduce with MongoDB
Map/Confused? A practical approach to Map/Reduce with MongoDBMap/Confused? A practical approach to Map/Reduce with MongoDB
Map/Confused? A practical approach to Map/Reduce with MongoDBUwe Printz
 
Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Tobias Trelle
 
Webinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB AppWebinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB AppMongoDB
 
MVVM Magic in SharePoint 2010 using Knockoutjs!
MVVM Magic in SharePoint 2010 using Knockoutjs!MVVM Magic in SharePoint 2010 using Knockoutjs!
MVVM Magic in SharePoint 2010 using Knockoutjs!jhendrix88
 
The secret sauce behind {binding} in xaml
The secret sauce behind {binding} in xamlThe secret sauce behind {binding} in xaml
The secret sauce behind {binding} in xamlbrendonpage
 
Play With Theschwartz
Play With TheschwartzPlay With Theschwartz
Play With TheschwartzHideo Kimura
 

What's hot (20)

Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
[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
 
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
 
Tutorial: Building Your First App with MongoDB Stitch
Tutorial: Building Your First App with MongoDB StitchTutorial: Building Your First App with MongoDB Stitch
Tutorial: Building Your First App with MongoDB Stitch
 
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 .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
 
MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...
MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...
MongoDB.local Atlanta: MongoDB Mobile: Bringing the Power of MongoDB to Your ...
 
MongoDB Meetup
MongoDB MeetupMongoDB Meetup
MongoDB Meetup
 
Jsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSONJsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSON
 
Schema Design Best Practices with Buzz Moschetti
Schema Design Best Practices with Buzz MoschettiSchema Design Best Practices with Buzz Moschetti
Schema Design Best Practices with Buzz Moschetti
 
Microsoft Web Matrix
Microsoft Web MatrixMicrosoft Web Matrix
Microsoft Web Matrix
 
Deciphering Explain Output
Deciphering Explain Output Deciphering Explain Output
Deciphering Explain Output
 
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
 
Map/Confused? A practical approach to Map/Reduce with MongoDB
Map/Confused? A practical approach to Map/Reduce with MongoDBMap/Confused? A practical approach to Map/Reduce with MongoDB
Map/Confused? A practical approach to Map/Reduce with MongoDB
 
Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Morphia, Spring Data & Co.
Morphia, Spring Data & Co.
 
Webinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB AppWebinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB App
 
MVVM Magic in SharePoint 2010 using Knockoutjs!
MVVM Magic in SharePoint 2010 using Knockoutjs!MVVM Magic in SharePoint 2010 using Knockoutjs!
MVVM Magic in SharePoint 2010 using Knockoutjs!
 
The secret sauce behind {binding} in xaml
The secret sauce behind {binding} in xamlThe secret sauce behind {binding} in xaml
The secret sauce behind {binding} in xaml
 
HTML5
HTML5HTML5
HTML5
 
Play With Theschwartz
Play With TheschwartzPlay With Theschwartz
Play With Theschwartz
 

Similar to Streaming Data Pipelines with MongoDB and Kafka at ao.com

Back to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDBBack to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDBMongoDB
 
MongoDB Tick Data Presentation
MongoDB Tick Data PresentationMongoDB Tick Data Presentation
MongoDB Tick Data PresentationMongoDB
 
Back to Basics Webinar 2 - Your First MongoDB Application
Back to  Basics Webinar 2 - Your First MongoDB ApplicationBack to  Basics Webinar 2 - Your First MongoDB Application
Back to Basics Webinar 2 - Your First MongoDB ApplicationJoe Drumgoole
 
Back to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB ApplicationBack to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB ApplicationMongoDB
 
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...MongoDB
 
MongoDB and Ruby on Rails
MongoDB and Ruby on RailsMongoDB and Ruby on Rails
MongoDB and Ruby on Railsrfischer20
 
Back to Basics 2017: Mí primera aplicación MongoDB
Back to Basics 2017: Mí primera aplicación MongoDBBack to Basics 2017: Mí primera aplicación MongoDB
Back to Basics 2017: Mí primera aplicación MongoDBMongoDB
 
MongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 Minutes
MongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 MinutesMongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 Minutes
MongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 MinutesMongoDB
 
moma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layermoma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layerGadi Oren
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBMike Dirolf
 
Mongodb intro
Mongodb introMongodb intro
Mongodb introchristkv
 
MongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and ImplicationsMongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and ImplicationsMongoDB
 
MongoDB at FrozenRails
MongoDB at FrozenRailsMongoDB at FrozenRails
MongoDB at FrozenRailsMike Dirolf
 
Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012sullis
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBMongoDB
 
Spring Data MongoDB 介紹
Spring Data MongoDB 介紹Spring Data MongoDB 介紹
Spring Data MongoDB 介紹Kuo-Chun Su
 
Beyond the Basics 2: Aggregation Framework
Beyond the Basics 2: Aggregation Framework Beyond the Basics 2: Aggregation Framework
Beyond the Basics 2: Aggregation Framework MongoDB
 
MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...
MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...
MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...MongoDB
 
How sitecore depends on mongo db for scalability and performance, and what it...
How sitecore depends on mongo db for scalability and performance, and what it...How sitecore depends on mongo db for scalability and performance, and what it...
How sitecore depends on mongo db for scalability and performance, and what it...Antonios Giannopoulos
 
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
 

Similar to Streaming Data Pipelines with MongoDB and Kafka at ao.com (20)

Back to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDBBack to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDB
 
MongoDB Tick Data Presentation
MongoDB Tick Data PresentationMongoDB Tick Data Presentation
MongoDB Tick Data Presentation
 
Back to Basics Webinar 2 - Your First MongoDB Application
Back to  Basics Webinar 2 - Your First MongoDB ApplicationBack to  Basics Webinar 2 - Your First MongoDB Application
Back to Basics Webinar 2 - Your First MongoDB Application
 
Back to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB ApplicationBack to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB Application
 
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
Webinaire 2 de la série « Retour aux fondamentaux » : Votre première applicat...
 
MongoDB and Ruby on Rails
MongoDB and Ruby on RailsMongoDB and Ruby on Rails
MongoDB and Ruby on Rails
 
Back to Basics 2017: Mí primera aplicación MongoDB
Back to Basics 2017: Mí primera aplicación MongoDBBack to Basics 2017: Mí primera aplicación MongoDB
Back to Basics 2017: Mí primera aplicación MongoDB
 
MongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 Minutes
MongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 MinutesMongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 Minutes
MongoDB World 2018: Tutorial - MongoDB & NodeJS: Zero to Hero in 80 Minutes
 
moma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layermoma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layer
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Mongodb intro
Mongodb introMongodb intro
Mongodb intro
 
MongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and ImplicationsMongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and Implications
 
MongoDB at FrozenRails
MongoDB at FrozenRailsMongoDB at FrozenRails
MongoDB at FrozenRails
 
Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 
Spring Data MongoDB 介紹
Spring Data MongoDB 介紹Spring Data MongoDB 介紹
Spring Data MongoDB 介紹
 
Beyond the Basics 2: Aggregation Framework
Beyond the Basics 2: Aggregation Framework Beyond the Basics 2: Aggregation Framework
Beyond the Basics 2: Aggregation Framework
 
MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...
MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...
MongoDB.local DC 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch Applic...
 
How sitecore depends on mongo db for scalability and performance, and what it...
How sitecore depends on mongo db for scalability and performance, and what it...How sitecore depends on mongo db for scalability and performance, and what it...
How sitecore depends on mongo db for scalability and performance, and what it...
 
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
 

More from MongoDB

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: 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: 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
 
MongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDB
MongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDBMongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDB
MongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDBMongoDB
 
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...MongoDB
 
MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...
MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...
MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...MongoDB
 

More from MongoDB (20)

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: 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: 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...
 
MongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDB
MongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDBMongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDB
MongoDB .local Paris 2020: Les bonnes pratiques pour sécuriser MongoDB
 
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
 
MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...
MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...
MongoDB .local Paris 2020: Adéo @MongoDB : MongoDB Atlas & Leroy Merlin : et ...
 

Recently uploaded

MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 

Recently uploaded (20)

MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 

Streaming Data Pipelines with MongoDB and Kafka at ao.com

  • 1. © 2018 AO World All Rights Reserved Streaming data pipelines with MongoDB and Kafka Jon Vines, Software Engineer and Team Lead
  • 2. • Jon Vines • Software Engineer and Team Lead @ AO.com • Get in touch: • jonvines • @_jonvines • Loves reading, recommends:
  • 3.
  • 4.
  • 8. A single customer view is an aggregated, consistent and holistic representation of the data held by an organisation about its customers that can be viewed in one place, such as a single page. Wikipedia [https://en.wikipedia.org/wiki/Single_customer_view]
  • 10.
  • 11.
  • 12. Why ?
  • 15. { "name" : "mongodb_europe_sql_connector", "config" : { "connector.class" : "io.confluent.connect.cdc.mssql.MsSqlSourceConnector", "tasks.max" : "1", "initial.database" : "MongoDBEurope2018", "username" : "cdc", "password" : "testing", "server.name" : "sqlserver", "server.port" : "1433", "change.tracking.tables" : "dbo.tbl_Customer" } } Kafka Connect SQL CDC
  • 16. ~/kafka$ bin/kafka-topics.sh --list --zookeeper zookeeper:2181/kafka cdc.MongoDBEurope18.tbl_Customer cdc.MongoDBEurope18.tbl_Order ~/kafka$ Viewing Kafka Topics
  • 17. ~/kafka$ bin/kafka-console-consumer.sh --bootstrap-server k1:9092 --topic cdc.MongoDBEurope18.tbl_Customer --from-beginning (sys_Change_operation|Mr Jon Vinesjon.vines@ao.comsys_change_creation_version 11862sys_change_version 11862 (sys_Change_operation|Mr Jonathan Vinesjon.vines@ao.comsys_change_creation_version 11874sys_change_version 11874 ~/kafka$ Viewing Kafka Topics
  • 18. { "type": "record", "name": "tbl_Customer", "fields": [{ "name": "customerId", "type": "int" }, { "name": "customerTitle", "type": "string" }, { "name": "customerFirstName", "type": "string" }, { "name": "customerSurname", "type": "string" }, {} ] } AVRO Serialisation
  • 19. public void ConsumeMessages(string brokerList, IEnumerable<string> topics) { using (var consumer = new Consumer<byte[], byte[]>(ConstructConfig(brokerList, true), new ByteArrayDeserializer(), new ByteArrayDeserializer())) { consumer.OnMessage += (_, message) => MessageReceived(message); consumer.Subscribe(topics); while (_consumeMessages) { consumer.Poll(TimeSpan.FromMilliseconds(100)); } } } Consuming Kafka Messages
  • 20. private void MessageReceived(Message<byte[], byte[]> message) { try { _processorStrategy.ProcessMessage(message.Topic, message); } catch (Exception exception) { throw; } } Consuming Kafka Messages
  • 21. public void ProcessMessage(Message<byte[], byte[]> message) { var cdcCustomer = _messageDeserializer.DeserializeMessage(message); var customer = _scvCustomer.Add(cdcCustomer); _customerRepository.Save(customer); } Processing Kafka Messages
  • 22. { "_id": "5af45b47db610c0001e222c1", "scvId": "xLOuIoVo20uDMh1g+Y7gsQ==", "customerSummaries": [ { "firstName": "Jon", "surname": "Vines", "title": "Mr", "landlineNumber": "01234125112" } ], "orders": [ { "orderNumber": "SCV201415081", "orderDate": "2018-10-15 17:31:02.000Z, "orderTotal": 329.00 } ], "lastActivity": "2018-06-15T10:00:47.470Z", "addedDate": "2018-04-10T16:05:13.000Z", "emailAddress": "jon.vines@ao.com", "versionNumber": 12 } Building up documents
  • 23. ... "customerSummaries": [ { "firstName": "Jon", "surname": "Vines", "title": "Mr", "landlineNumber": "01234125112" }, { "firstName": "Jonathan", "surname": "Vines", "title": "Mr", "landlineNumber": "01234125112" } ], "orders": [ { "orderNumber": "SCV201415081", "orderDate": "2018-10-15 17:31:02.000Z", "orderTotal": 329.00 }, { "orderNumber": "SCV201417812", "orderDate": "2018-10-15 17:31:02.000Z", "orderTotal": 329.00 } ] ... Building up documents
  • 24. { "name" : "mongodb_europe_oplog_connector", "config" : { "connector.class" : "io.debezium.connector.mongodb.MongoDbConnector", "mongodb.hosts" : "rs0/192.168.99.27017", "mongodb.name" : "SCV", "collection.whitelist" : "SCV_Customer[.]*" } } Kafka Connect MongoDB OpLog
  • 26. Generating batches private void GenerateBatchJobs(int? firstEntityId, int lastEntityId, int maxBatchesGenerated) { var isFirstEntityIdProcessed = false; var numberOfBatchesGenerated = 0; _currentJobId = Guid.NewGuid(); while (!isFirstEntityIdProcessed && numberOfBatchesGenerated != maxBatchesGenerated) { var firstEntityIdOfBatch = lastEntityId; var aoEntityBatch = _repository.Find(_limit, firstEntityIdOfBatch, _fieldName).ToList(); ProcessEntityBatch(aoEntityBatch); lastEntityId = aoEntityBatch.Last().GetEntityId(); if (aoEntityBatch.Any(x => x.GetEntityId() == firstEntityId)) { isFirstEntityIdProcessed = true; } lastEntityId--; numberOfBatchesGenerated++; } }
  • 28.
  • 29. Use .explain() public IEnumerable<T> Find(Expression<Func<T, bool>> expression, Expression<Func<T, int>> sortExpression, int limit, string hint) { return _database .GetCollection<T>(_collectionName) .AsQueryable(new AggregateOptions() { Hint = new BsonDocument(hint, 1) }) .Where(expression) .OrderBy(sortExpression) .Take(limit); } ... db.order .explain('executionStats') .aggregate([ { $match: { numberOfTimesProcessed: { $lt: 3 }, Id: { $gte: 19020680 } } }, { $sort: { salesOrderId: 1 } }, { $limit: 50 } ], {hint: { Id: 1 }});
  • 30. public IEnumerable<T> Find(string fieldName, int entityId, int maxNumberOfTimesProcessed, int limitToReturn) { var filter = new BsonDocument { { Numberoftimesprocessed, new BsonDocument("$lt", maxNumberOfTimesProcessed) }, { fieldName, new BsonDocument("$gte", entityId) } }; var sort = new BsonDocument(fieldName, 1); IAsyncCursor<T> query = _database.GetCollection<T>(_collectionName).Find(filter).Sort(sort) .Limit(limitToReturn).ToCursor(); return query.ToList(); } Use native query language
  • 31. Use _id when possible
  • 32. Watch for unbounded document growth
  • 33.
  • 34. Lambda + VPC Peering + MongoDB Atlas = Cold Starts
  • 35. Cache your database object in your lambdas
  • 36. public LambdaConstructor() { var secretManager = new SecretManager(new ConfigurationManager()); var mongoDb = JsonConvert.DeserializeObject<MongoConnectionString>( secretManager.Get(Environment.GetEnvironmentVariable("SECRET_NAME"))); var mongoClient = new MongoClient(mongoDb.ConnectionString); var mongoDatabase = mongoClient.GetDatabase(Environment.GetEnvironmentVariable("MONGODB_GDPR_SUPPRESSION_COLLECTION")); var pack = new ConventionPack {new CamelCaseElementNameConvention(), new IgnoreIfNullConvention(true)}; ConventionRegistry.Register("camel case", pack, t => true); } MongoDB once in Lambda Serverless development with Node.js, AWS Lambda and MongoDB Atlas https://bit.ly/2HrOGYX
  • 37. Data access in Serverless architectures
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

Editor's Notes

  1. Directors story Title, looking at Steps to data platform Lessons learned MongoDB Lessons learned Serverless Key message
  2. Introduce About me Books
  3. Team Firstly Secondly
  4. Who are AO (northern values) Part of a growing tech scene in Manchester and proud members of Norther Powerhouse True north – We want the happiest customers, and we do that by relentlessly striving for a better way We go back to the story we started with This is why Single Customer View!
  5. Talk outline
  6. Rates of data Usually lots of Hidden value Get to it via analysing historical or reacting as it’s generated Challenges of getting it -> ETL New data – traditional ways of getting out
  7. AO.com data Team Mission Building the single customer view
  8. What is SCV? Questions Big pool of data? What data is appropriate? What’s a customer, someone who’s transaction?
  9. Understand where it came from Most value when it’s hot Producing data all the time (Website, call centre, order processing) Comes from (SQL Server, queues, clickstream) Look for advantage when data is hottest
  10. Principles DevOps Coupling Stream processing Infrastructure as code and as few servers as possible Evolvable data schema
  11. Tech Stack Cloud native AWS .net core Host in docker and lambda Deploy using terraform and serverless framework Stream data using Apache Kafka with Confluent OSS (only thing that needs servers) MongoDB to build context specific materialised views Hosted in Atlas
  12. Why MongoDB? [PAUSE] First options Tech enables Data sources means NoSql MongoDB Developer friendly No mapping code, no ORM Drivers Fast Atlas
  13. Outline the slides SQL – CDC – Kafka – Consumer – MongoDB Stage two – release from MongoDB Bigger text
  14. Key over the next few slides – describe the key
  15. - First challenge - Reduce risk of coupling - CDC (used in replication) - Kafka connect – more protection (open source) - Talk through the slide (better detail)
  16. - Command line
  17. - Explain what’s happening on the slide - Recap on what we’ve done Why does the data look funny?
  18. Introduce the key Avro Avro and Schema Registry
  19. Example of C# Language doesn’t matter
  20. Strategy
  21. Talk through the slide Deserialize schema reg Build single customer Save to repo
  22. If we switch to MongoDB atlas, for us, this means constructing the Single Customer View from the incoming customer stream. - Show the SCV object – talk through where we’re adding data
  23. If we switch to MongoDB atlas, for us, this means constructing the Single Customer View from the incoming customer stream. - Show the SCV object – talk through where we’re adding data
  24. Power of approach - Construct and push to Kafka - Self fulfilling system - ASIDE : Change streams
  25. Quick recap This approach allowed us to get to production in less than three months Portal for our fraud team to give the personal touch GDPR client Got the building blocks for our Single Customer View platform in place Lessons learned so far
  26. Early issues (batching, paging) – basically, query composition… there is a great talk coming up later on avoiding common query pitfalls, I think we could have done with that earlier
  27. WHO LIKES ALERTS? You can see the alert and the graph both show that query targeting is a problem. This means our index either wasn’t correct or wasn’t being used. Talk through slide
  28. Team story MongoDB support Extension of the team when trying to solve problems Follow up after resolution with our customer care representative – find out more in Vladis talk In this instance, we needed to get our thinking caps on, this normally results in head scratching, and white boarding sessions
  29. - LINQ - Aggregation framework - Explain command
  30. Using Linq because? Recommend native query language Talk through slide
  31. _id Duplicated indexes (makes _id redundant) Duplicated disk space
  32. Keep an eye out Projection Customers transacting a lot
  33. Does anybody here use AWS and Lambdas? [PAUSE] Story on serverless Team principle – as few servers as possible Serverless architectures promise: No servers to manage Continuous scaling and balancing Automatic fail-over Paying only for what we use As a team we were sold, ready to go And my manager was happy too What could go wrong?
  34. We have a couple of gotchas to watch out for if you go down this route. Cold starts (Adding RAM) VPC Peering and Atlas (good) VPC Peering and Atlas (bad)
  35. - Cache database in lambda for reuse
  36. C# constructor Also a great blog post on MongoDB.com for node
  37. Benefits of serverless Using serverless and MongoDB Atlas GDPR A recent blog post by Jeremy Daly says that serverless microservices should at least adhere to the following standards: Services should have their own private data Be independently deployable Utilise eventual consistency Use async workloads wherever possible And finally, our services should be small, but valuable - How does this help?
  38. - Recap - Decoupled services - Lessons learned
  39. So I want to ask the question again, what is Single Customer View. What does it mean to achieve this? [PAUSE] Initial thoughts I believe (unique customer experiences) Legacy does this Data trapped in legacy data layers as seed innovation and experimentation Kafka Mongodb
  40. This allows us to produce ever richer data applications in a safe way. It allows us to experiment with hypothesis where we can pull in the data and verify it works. If it doesn’t we have the opportunity to iterate quickly and release something that moves closer to where we want to be.
  41. - More often == richer - Ecosystem to drive new innovations - Continue to publish into this ecosystem
  42. Enable thinking Embrace as differentiator Few lines of code (building rather than managing) Get to production quickly, meet objectives quickly Our team mission evolved: Getting data to the right teams Increasing customer safety, well-being and ultimately happiness
  43. I believe that we have unlocked some really powerful concepts, which has set us up to build new applications that will help us succeed and thrive in the future. We’ve unlocked data from legacy applications and data stores We’ve decoupled teams to increase delivery frequency We’ve embraced technology as a differentiator to give our customers a better experience And, we’ve given ourselves the opportunity to capture stories like the one we started with.
  44. I still feel that we’re at the start of our journey with the possibilities of the Single Customer View project at AO. I believe we’re building an architecture and platform that will truly allow us to build applications that genuinely help and improve our customer journey and we’re very excited at what lies ahead. Thank you - Start of journey