Building a Social Network with MongoDB

65 downloads 418 Views 1MB Size Report
Dec 3, 2010 - Page 1. Building a Social Network with MongoDB. Brian Zambrano. MongoSV ... Eventbriteʼs Social Graph. 5.
Building a Social Network with MongoDB Brian Zambrano MongoSV December 3, 2010

1 Friday, December 3, 2010

Eventbrite Brand Tenets

2 Friday, December 3, 2010

Eventbrite Brand Tenets

3 Friday, December 3, 2010

Social Recommendations

4 Friday, December 3, 2010

Eventbriteʼs Social Graph

5 Friday, December 3, 2010

Eventbriteʼs Social Graph

6 Friday, December 3, 2010

Neighbors

7 Friday, December 3, 2010

Challenges • Dynamic • Neighbors change often • Neighborsʼ events change often

• Flexibility • Want to incorporate other social graphs • Product may evolve quickly

• Performance • We need really fast reads • Frequent writes 8 Friday, December 3, 2010

Why MongoDB? • Performance • Flexible schema design • Easy to work with • We felt comfortable MongoDB would mature as our needs became more demanding

9 Friday, December 3, 2010

Providing Recommendations 1. User visits http://eventbrite.com/mytickets/ 2. Fetch neighbors 3. Fetch neighborsʼ events 4. Score each possible event 5. Return recommendations

10 Friday, December 3, 2010

MongoDB setup • One non-sharded replica set • Two DBs on Large EC2 instances • One arbiter

• Three collections • Users • Events • Orders

11 Friday, December 3, 2010

User Data in MongoDB { "_id": 4558992, }

Unique User Id

12 Friday, December 3, 2010

User Data in MongoDB { "_id": 4558992, "events" : { "all_ids": [ 116706, 179487, 16389, 827496 ], "curr_ids": [ 827496 ], }, }

Past and current attendance

13 Friday, December 3, 2010

User Data in MongoDB { "_id": 4558992, "events" : { "all_ids": [ 116706, 179487, 16389, 827496 ], "curr_ids": [ 827496 ], }, "nns" : [ [ 2816442, 0.2 ], [ 1615962, 0.047619047619047616 ], ], }

Nearest neighbors (user_id, score)

14 Friday, December 3, 2010

User Data in MongoDB { "_id": 4558992, "events" : { "all_ids": [ 116706, 179487, 16389, 827496 ], "curr_ids": [ 827496 ], }, "nns" : [ [ 2816442, 0.2 ], [ 1615962, 0.047619047619047616 ], ], "fb" : { "_id" : 4808871, "name" : "Brian Zambrano", "location" : "San Francisco, California", "friends" : [ 568876525, 569507467, 569559792 ], }, }

Facebook data

15 Friday, December 3, 2010

MongoDB Indexes { "_id": 4558992, "events" : { "all_ids": [ 116706, 179487, 16389, 827496 ], "curr_ids": [ 827496 ], }, "nns" : [ [ 2816442, 0.2 ], [ 1615962, 0.047619047619047616 ], ], "fb" : { "_id" : 4808871, "name" : "Brian Zambrano", "location" : "San Francisco, California", "friends" : [ 568876525, 569507467, 569559792], }, } 16 Friday, December 3, 2010

Events Collection > db.events.findOne({_id: 799177}) { "_id" : 799177, "uid" : 2989008, "title" : "MongoSV", "venue" : { "loc" : [ 37.413042, -122.071106 ], "state" : "CA", "id" : 508093, "city" : "Mountain View" }, "logo" : "758915938.png", "shortname" : "mongosv", "start_date" : "Fri Dec 03 2010 01:00:00 GMT-0800 (PST)" } 17 Friday, December 3, 2010

Orders Collection > db.orders.find({_eid: 799177}) { "_id" : 17464215, "_uid" : 1111195, "_eid" : 799177 } { "_id" : 17575729, "_uid" : 6970539, "_eid" : 799177 } { "_id" : 17582343, "_uid" : 3092687, "_eid" : 799177 } { "_id" : 17588693, "_uid" : 2255017, "_eid" : 799177 } { "_id" : 17589589, "_uid" : 6976917, "_eid" : 799177 } { "_id" : 17601979, "_uid" : 885441, "_eid" : 799177 } { "_id" : 17603085, "_uid" : 2500199, "_eid" : 799177 } { "_id" : 17608289, "_uid" : 6984367, "_eid" : 799177 } { "_id" : 17681965, "_uid" : 628459, "_eid" : 799177 } { "_id" : 17684489, "_uid" : 7017999, "_eid" : 799177 } { "_id" : 17689673, "_uid" : 7020133, "_eid" : 799177 } { "_id" : 17728267, "_uid" : 7036607, "_eid" : 799177 } has more

18 Friday, December 3, 2010

Recommended Events Query Two + n queries 1. Get neighbors nns = db.users.find({_id : {$in : user.nn_ids}})

2. Get possible event recommendations: db.events.find({_id : {$in : nns.events.all}})

n.For each event, get total attendee count db.orders.find({_eid : event_id})

19 Friday, December 3, 2010

Recommended Events Query Two + n queries 1. Get neighbors nns = db.users.find({_id : {$in : user.nn_ids}})

2. Get possible event recommendations: db.events.find({_id : {$in : nns.events.all}})

n.For each event, get total attendee count db.orders.find({_eid : event_id})

Optimization opportunity: Embed orders in Event records

20 Friday, December 3, 2010

Updating Neighbors Two queries, one update 1. Get all orders for a userʼs past events: uids = db.orders.find({_id : {$in : user.events.all}})

2. Get all neighbors: nns = db.users.find({_id : {$in : uids}})

➡Score neighbors 3. Update nn_ids db.users.update({_id : uid}, {$set : {nn_ids: nn}})

21 Friday, December 3, 2010

Facebook Friendʼs Events Two queries 1. Get FB friends db.users.find({fb._id : {$in : fb.friends}})

2. Get events FB friends are attending db.events.find({_id : {$in : fb_friends_events}})

22 Friday, December 3, 2010

The Future • Incorporate other social networks • Iterate scoring algorithm • Count recommendation impressions

23 Friday, December 3, 2010

Weʼre hiring! http://www.eventbrite.com/jobs/

24 Friday, December 3, 2010

Thanks! Brian Zambrano Eventbriteʼs new Facebook recommendations power social event discovery: http://bit.ly/gRVS7I Social Commerce: A First Look at the Numbers: http://bit.ly/gXeg9Q

25 Friday, December 3, 2010