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

Posted

技术标签:

【中文标题】社交网站如何计算好友更新?【英文标题】:How do social networking websites compute friend updates? 【发布时间】:2010-10-20 05:38:27 【问题描述】:

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

他们如何使用这些表以高效且可扩展的方式计算好友事件?

【问题讨论】:

【参考方案1】:

许多社交网站(如 Twitter)根本不使用 RDBMS,而是使用 Message Queue 应用程序。其中很多都是从已经存在的应用程序开始的,比如 RabbitMQ。其中一些变得足够大,他们必须大量定制或构建自己的。 Twitter 正在第二次这样做。

消息队列应用程序通过为一项或多项其他服务保存来自一项服务的消息来工作。例如说服务弗兰克正在向队列 foo 发布消息。 Joe 和 Jill 订阅了 Franks foo 队列。应用程序将跟踪 Joe 或 Jill 是否收到了消息,并且一旦队列的每个订阅者都收到了消息,它就会丢弃它。弗兰克发送消息并忘记了它。 Joe 和 Jill 向 foo 请求消息并获取他们尚未收到的任何消息。乔和吉尔对消息做任何他们需要做的事情。也许保留它也许不会。

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

编辑:我还应该提到,通常这些大规模存储的东西是严重非规范化的。因此,Joe 和 Jill 可能正在存储完全相同的消息的副本。这被认为是可以的,因为它有助于将应用程序扩展到数十亿用户。

其他阅读:

    http://www.rabbitmq.com/ http://qpid.apache.org/

【讨论】:

+1 提到了非规范化,这对于 3NF 长期以来一直是指导明星的旧 SQL 世界来说并不明显。 (en.wikipedia.org/wiki/Third_normal_form)【参考方案2】:

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

两种流行的图形表示方法是adjacency lists 和adjacency matrices。

邻接表只是图上的边列表。考虑一个具有整数用户 ID 的用户。

User1, User2
  1      2
  1      3
  2      3

这些记录的无向解释是用户 1 是用户 2 和用户 3 的朋友,用户 2 也是用户 3 的朋友。

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

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

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

【讨论】:

【参考方案3】:

Travis 写了一篇很棒的文章,

Activity Logs and Friend Feeds on Rails & pfeed

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于社交网站如何计算好友更新?的主要内容,如果未能解决你的问题,请参考以下文章

邀请好友的 RoR 插件

为社交网站设计朋友表

社交引擎上的自动完成好友列表无法正常工作

自动将我网站上的新更新分享到社交网络?

如何从给定的网站中提取社交信息?

PageRank算法实现好友推荐(算法原理)