Scalability 社交网站如何计算好友更新?

Scalability 社交网站如何计算好友更新?,scalability,social-networking,Scalability,Social Networking,社交网站可能会为用户、朋友和活动维护表格 他们如何使用这些表以高效和可伸缩的方式计算好友事件?对于小规模用户,在users.friends和users.events上进行连接和查询缓存可能很好,但随着好友和事件的增长,速度会很快减慢。您还可以尝试一种基于事件的模型,在该模型中,每次用户创建事件时,都会在联接表中创建一个条目(可能称为“friends\u events”)。因此,每当用户想要查看他们的朋友创建了什么事件时,他们只需在他们自己的id和friends_events表之间进行连接,就可以

社交网站可能会为用户、朋友和活动维护表格


他们如何使用这些表以高效和可伸缩的方式计算好友事件?

对于小规模用户,在users.friends和users.events上进行连接和查询缓存可能很好,但随着好友和事件的增长,速度会很快减慢。您还可以尝试一种基于事件的模型,在该模型中,每次用户创建事件时,都会在联接表中创建一个条目(可能称为“friends\u events”)。因此,每当用户想要查看他们的朋友创建了什么事件时,他们只需在他们自己的id和friends_events表之间进行连接,就可以找到。通过这种方式,您可以避免抓取所有a用户的好友,然后将他们的好友加入事件表。

社交网站的主要数据结构是。在facebook上,图表是无向的(当你是某人的朋友时,他们就是你的朋友)。在twitter上,图表是有方向的(你跟随某人,但他们不一定跟随你)

表示图形的两种常用方法是和

邻接列表只是图上的边列表。考虑一个具有整数用户标识的用户。
User1, User2
  1      2
  1      3
  2      3
这些记录的无向解释是,用户1与用户2和3是朋友,用户2也与用户3是朋友

在数据库表中表示这一点很简单。我们熟悉的是多对多关系联接表。查找特定用户朋友的SQL查询非常容易编写

既然您知道了某个特定用户的朋友,您只需将这些结果加入更新表。此表包含按用户id索引的所有用户更新


只要所有这些表都被正确地索引,您就可以很容易地设计高效的查询来回答您感兴趣的问题

许多像Twitter这样的社交网站根本不使用RDBMS,而是使用消息队列应用程序。它们中的很多都是从一个已经存在的应用程序开始的,比如RabbitMQ。他们中的一些人变得足够大,他们不得不大量定制或建立自己的。Twitter正在第二次这样做

消息队列应用程序通过为一个或多个其他服务保存来自一个服务的消息来工作。例如,假设服务Frank正在向队列foo发布消息。乔和吉尔订阅了法兰克福队列。应用程序将跟踪Joe或Jill是否接收到消息,一旦队列的每个订户接收到消息,它将丢弃消息。弗兰克发短信,却忘了。乔和吉尔要求福给他们留言,并得到他们还没有收到的任何留言。乔和吉尔对这个消息做了他们需要做的一切。也许把它留在身边,也许不是

消息队列应用程序保证每个应该获取消息的人都可以并且将在请求消息时获取消息。发布者可以发送消息,确信订阅者最终可以获得消息。这样做的好处是完全异步,不需要昂贵的连接

编辑:我还应该提到的是,通常在高规模上对这类东西的存储进行了严重的非规范化。所以乔和吉尔可能正在储存一份完全相同的信息。这被认为是正常的,因为它帮助应用程序扩展到数十亿用户

其他案文:


  • 特拉维斯写了一篇很好的文章


    +1对于提到非规范化,这对于旧SQL世界来说并不明显,因为3NF长期以来一直是指导星。()