我只是看热闹的 "上升和下降的Twitter" 这让我想到:

如果你重新实现twitter,你会做什么不同?

什么样的技术你会用呢?什么语言吗?

你怎么确保服务的可伸缩?

还有什么你会改变?

有帮助吗?

解决方案

我已经实现它在再是这样的:

每个用户将有一个表,其中包含的信息的人,他们遵循。这表将键的(用户、时间戳降).

每个用户也有一个follower_ranges表,其地图使用户设定的连续跟随id范围。对于大多数用户,只有几万追随者,这表将有一个单一的入口(-inf..+inf);这将是暗示的默认。对用户有更多的追随者,每一范围表中将会有几万用户。范围将是平衡的过时保留的用户数量在内的每一些时间间隔,例如大于1000时,小于10000。该联盟的所有范围将包括所有用户标识。

每当一个用户>追随者的动作是建立,它是编码作为一个行动,并加入到队列。每个元素的队列是一个(发送者、操作有效载荷,追随者的子范围)tuple.的队列中的工人采取的一个项目,发现所有的追随者在给出的子范围,以及适用的行动,他们每个人。(注意,该行动可以是"增加一鸣叫","删除鸣叫"、"编辑鸣叫",等等。基本上,任何事情,这将需要应用于所有追随者。)

申请队列的行动每个追随者将涉及签发相应写入和删除以每个用户的鸣叫表。阻挡队将意味着写将不会瞬间出现的,但它应该能够保持延迟下一个几秒钟。

显示出用户自己的推文将是一个便宜的运作:"SELECT*from鸣叫里user_id=:user_id以通过(创建DESC)限制:max_per_page".这将扫描一个单一的表格,并以非常快捷操作。(保持用户阻延迟下来好!)

我觉得这个设计会规模相当良好的开始。每个组成部分的系统,现在可以扩大容易:

  • 的队列中的存储,可以支持通过再和缩,因为每任何数据储存表
  • 在前端,可以扩大自然,并不需要粘性
  • 更队处理器可以在任何时间加入
  • 实际储存表,将自然生长,应该规模的现在数据存储库。

这就是说,我可以认为一对夫妇未来改进我会看到立即:

  • 减少储存的很少显示的数据。这种设计denormalizes鸣叫每个成每随副本。但是只有最近的鸣叫的通常访问。通过删除的每用户复印的鸣叫后他们N天,我们可以恢复大量的储存。如果一个用户试图从古老的历史,我们获取数据从非标准化的表格。这将减慢,但是不会发生太多,以及储蓄将是巨大的。存储蓄:(#avg_followers-1)/#avg_followers
  • 写的模式是非最佳。在多个队列项目,每个队列工作将是编写向每个用户的推表,因此本地区的写将不会非常好。(最糟糕的是,我们有#处理器*#储存服务器的连接。) 这可以通过应用多种更新的各个范围内的用户。例如,如果两个行动A和B均应用于范围[0,10000),然后有一个单一的队处理器适用这两项行动的一次。

其他提示

它已经在这样做: Laconica

  1. 它已经正在做第二部分的复仇: hospitality club.ca (这是在顶部的Laconica)
  2. 它已经完成第三部分从黑暗的一面: linkedin

VBG!(-:

我要开始的前提下回到做一遍:我会做什么不同,我在twitter回来然后呢?

不事情。

Twitter保持专注于什么事项:提供服务的人实际上 使用。

我喜欢工作在一个产物,它成为这样受欢迎,在这样短的时期,其最大的威胁,成为其自己的可伸缩性。这意味着你已经赢了。有成功的资源和注意力,以利用的成功。

我想设计它可扩展的像地狱只是从一开始。

我的选择将在微软平台,C#、IIS SQL服务器、存缓存(或速度,如果它是最终和运行良好,当我开始;-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top