2009-04-17 51 views

回答

37

许多社交网站如Twitter的不除了Message Queue应用程序外,完全可以使用RDBMS。他们中的很多人开始使用像RabbitMQ这样的应用程序。他们中的一些人足够大,他们必须大量定制或建立自己的。 Twitter正在进行第二次这样做。

消息队列应用程序通过为一个或多个其他服务保存来自一个服务的消息来工作。比如说服务Frank将消息发布到队列foo。 Joe和Jill订阅了Franks foo队列。应用程序将跟踪Joe或Jill是否收到消息,并且一旦队列中的每个订户都收到它丢弃的消息。弗兰克发出消息并忘记它。 Joe和Jill要求foo发送消息并获取他们还没有收到的消息。乔和吉尔做了他们需要处理的信息。也许保持它可能不是。

消息队列应用保证大家谁应该能得到消息,当他们要求他们将得到的消息。发布者可以发送消息确信订户可以最终获得它们。这具有完全异步的优点,并且不需要昂贵的连接。

编辑:我还要提到的是,通常这些高规模的存储都是非常规范化的。所以乔和吉尔可能会存储完全相同的消息的副本。这被认为是可行的,因为它可以帮助应用扩展到数十亿用户。

其他阅读:

  1. http://www.rabbitmq.com/
  2. http://qpid.apache.org/
+1

+1提的非正规化,这是不是对旧的SQL工作很明显ld在那里3NF长期以来一直是引导性的明星。 (http://en.wikipedia.org/wiki/Third_normal_form) – Crypth 2013-09-26 07:21:35

0

对于小规模上做users.friends和users.events和查询高速缓存的加入可能是罚款,但不会很快作为朋友和事件增长放缓。您还可以尝试基于事件的模型,其中每次用户创建一个事件时,都会在连接表中创建一个条目(可能称为“friends_events”)。因此,无论何时用户想要查看他们的朋友创建的事件,他们都可以简单地在他们自己的id和friends_events表之间进行连接并查找。通过这种方式,您可以避免与朋友一起抓住所有用户,然后通过事件表加入他们的朋友。

7

社交网站的支柱数据结构是graph。在脸书上,图表是无向的(当你是某人的朋友时,他们是你的朋友)。在Twitter上,图表是直接的(你跟随某人,但他们不一定跟随你)。

两个流行的方式来表示图是adjacency listsadjacency matrices

邻接列表只是图中边缘的列表。考虑具有整数用户标识的用户。

User1, User2 
    1  2 
    1  3 
    2  3 

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

在数据库表中代表这是微不足道的。它是我们熟悉的多对多关系连接表。 SQL查询来查找特定用户的朋友很容易编写。

既然您了解特定用户的朋友,您只需将这些结果加入更新表。该表包含用户ID索引的所有用户更新。

只要所有这些表都正确的索引,你有一个非常简单的时间设计高效的查询来回答你感兴趣的问题。