如果你重新实现了twitter,你会采取哪些不同的做法?

时间:2008-09-17 22:13:07

标签: ruby-on-rails ruby architecture twitter microblogging

我刚看到让我想到的热闹的"The Rise and Fall of Twitter"

如果你重新实现推特,你会采取哪些不同的做法?

您会使用哪些技术?什么语言?

您如何确保服务可扩展?

你还会改变什么?

5 个答案:

答案 0 :(得分:4)

我会在GAE上实现它,就像这样:

每个用户都会有一个表格,其中包含他们关注的人的推文。该表将由(用户,时间戳降序)键入。

每个用户还有一个follower_ranges表,它将用户映射到一组连续的跟随者ID范围。对于大多数只有几千个粉丝的用户,这个表只有一个条目(-inf .. + inf);这将是隐含的默认值。对于拥有更多关注者的用户,表中的每个范围将有几千个用户。范围将随时间平衡,以使每个用户的数量保持在某个间隔内,例如,大于1000,小于10000.所有范围的并集将包括所有用户ID。

每当用户 - >创建了跟随者操作,它被编码为动作并添加到队列中。队列中的每个元素都是(发送者,动作,有效负载,跟随者子范围)元组。队列工作者获取一个项目,找到给定子范围内的所有关注者,并将操作应用于每个项目。 (请注意,操作可以是“添加推文”,“删除推文”,“编辑推文”等。基本上任何需要应用于所有关注者的内容。)

将队列操作应用于每个关注者将涉及向每个用户的推文表发出相应的写入和删除。队列的障碍意味着写入不会立即出现,但应该可以将延迟保持在几秒钟之内。

向用户展示他们的推文将是一个廉价的操作:“SELECT * FROM推文WHERE user_id =:user_id ORDER BY(created_at DESC)LIMIT:max_per_page”。这将扫描单个表,并且是一个非常快速的操作。 (保持用户阻塞延迟很好!)

我认为这种设计最初可以很好地扩展。现在可以轻松扩展系统的每个组件:

  • 队列存储可以由GAE支持,并根据任何数据存储表进行缩放
  • 前端可以自然缩放,不需要粘性
  • 可以随时添加更多队列处理器
  • 实际存储表会自然增长,并且应该在数据存储区上正常扩展。

那就是说,我可以想到一些我将立即研究的未来改进:

  • 减少很少显示数据的存储空间。此设计将每条推文非规范化为每个跟随者副本。但是,通常只访问最新的推文。通过在N天之后删除每个用户的推文副本,我们可以恢复大量存储空间。如果用户试图从古代历史中查看某些内容,我们将从非规范化表中获取数据。这将会变慢,但不会经常发生,节省的费用也会很高。节省存储空间:(#avg_followers - 1)/ #avg_followers
  • 写入模式不是最佳的。在多个队列项中,每个队列工作者都将写入每个用户的tweets表,因此写入的位置不会很好。 (最坏的情况是,我们将拥有#processor * #storage服务器连接。)这可以通过对每个用户范围应用多个更新来解决。例如,如果要将两个操作A和B应用于范围[0,10000),则让一个队列处理器一次应用这两个操作。

答案 1 :(得分:2)

它已经完成:Laconica

答案 2 :(得分:1)

  1. 已经完成第二部分 - 复仇:identi.ca(超过Laconica的顶部)
  2. 已经完成第三部分 - 从黑暗面:yammer
  3. VBG! ( - :

答案 3 :(得分:0)

我将从回去再做一次的前提开始:我会做什么不同的,那时我是不是在推特?

不是一件事。

Twitter始终关注重要事项:提供人们实际想要使用的服务。

我很乐意研发一款在如此短的时间内变得如此受欢迎的产品,其最大的威胁成为其自身的可扩展性。这意味着你赢了。成功的是资源和注意力,以利用成功。

答案 4 :(得分:-3)

我会从一开始就设计它像地狱一样可扩展。

我的选择是微软平台,C#,IIS,SQL Server,Memcached(如果它是最终版本的Velocity,当我开始时运行良好;-)