您如何在高流量网站上扩展投票系统?

时间:2011-08-22 06:19:23

标签: mysql memcached scalability

查看

你登陆了一个充满评论的页面。评论的投票系统将以您的投票结果突出显示。

vote up reddit

数据库

为支持此要求,数据库架构至少应为:

网页

  • int pageId

评论

  • int commentId
  • int pageId

投票

  • int userId
  • int commentId
  • enum(向上,向下)方向

控制器

如果页面ID为123且用户ID为456,则这将是控制器的简单实现:

1)查询用户456对第123页的评论所做的所有投票:

SELECT c.commentId, v.direction 
FROM comments AS c, votes AS v 
WHERE c.pageId = 123 
AND c.commentId = v.commentId
AND v.userId = 456

2)使用此查询的结果构建视图。

可伸缩性问题

支持这种投票系统的数据库查询非常昂贵。评论和投票表将是巨大的。在高流量站点上,成千上万的用户将每秒执行此查询以接收评论投票的个性化视图。你如何扩展这个投票系统,以便数据库不会因过多的请求而过载?你会把它缓存在内存中吗?难道只是将大量观众共同的东西缓存到实践中是不是实际操作?在这种情况下,这些查询特定于单个用户。在拥有数百万用户的网站上,内存很快就会被填满。将发生缓存未命中,数据库将被破坏。

1 个答案:

答案 0 :(得分:2)

认为 Reddit会缓存/存储(针对每个评论)投票的用户列表(以及另一个投票的用户)并且每隔X秒/分钟/小时仅更新此缓存在活动上。该列表将被组织为可以进行二进制搜索。

然后,当生成页面时,服务器只需要检查当前用户ID是否在每个评论的上/下选民的“列表中”。 Reddit还限制了最初可见的注释数量,这将减少所需的测试数量。

Reddit也不会立即更新投票(他们将投票添加到队列中)。他们可以将队列的处理和投票的缓存联系在一起。

我认为reddit还必须基于每个用户跟踪最近的投票,以便他们可以填补上次缓存更新与现在之间的差距。

这可能不是100%准确。
它基于对Reddit架构的有限阅读以及我将要做的事情。