类似Reddit的热门页面后端架构

时间:2016-01-08 03:50:12

标签: architecture reddit

我试图制作reddit如何计算和提供热门页面的后端设计。我也使用了#34; hot"评级以订购我网站上的帖子。我有一些问题,我试图克服。这些是我认为设计可能有意义的一些方法:

计算热门值目前我计算价值并将其与投票本身一起存储在数据库中,每当有人赞成帖子或任何人加载帖子时。这可能不是很好。我只想每5分钟通过一个cron作业更新所有帖子的热门价值,例如仅适用于比2个月更新的帖子。这个设计应该对成千上万的帖子起作用,有些我不确定这是否是最好的解决方案,但我确实读过reddit,至少在开始时确实使用cron作业来做到这一点。

查询帖子:这是我此刻更担心的部分。现在的问题是,如果我滚动(页面底部加载了更多的帖子),由于帖子上升和下降的热值,我可能会看到重复的帖子。现在,每次加载新帖子时,都会进行数据库查询以检索帖子。我认为使用memcached和缓存帖子的查询会很有意义(这需要适用于很多页面),但我不确定这是否能完全解决我的问题。理想情况下,我找到一个基本上"快照" (缓存?)db并从db中该表版本加载,直到加载新页面。

这个问题一直困扰着我多年,我试图找到一个合适的解决方案,关于如何最好和最有效地计算热门评级值并按热门评级的顺序获得帖子而不是当我向下滚动页面并加载新的帖子集时,值会更改(以避免重复和可能丢失的帖子),同时保持流程的良好和高效。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你不应该担心重复的帖子。大多数网站(包括reddit)都有这个问题。

我不认为有一个可以很好地扩展的解决方案。大多数站点都重视性能和可伸缩性而非一致性这就是为什么nosql越来越受欢迎这样的事情。它们不保证一致性(或仅保证最终的一致性),但可以提供更好的性能和水平可扩展性。

如果你真的想解决它,我会看一下客户端。根据您的描述,我了解您将拥有一个无限卷轴'那种网站。你可以让客户记住'哪些帖子已经显示。如果服务器向其发送更多帖子(当向下滚动时),则客户端可以过滤掉它已经在上面显示的帖子,例如,保留一个帖子ID列表。

答案 1 :(得分:0)

  

现在的问题是如果我滚动(页面底部加载了更多帖子),由于帖子在热门值上升和下降,我可能会看到重复的帖子。

这是reddit中一个长期存在的问题。没有简单的解决方案,但您可以使用客户端方法隐藏当前页面上已存在的帖子。

  

计算热门价值:目前,每当有人投票或任何人加载帖子时,我都会计算价值并将其与投票本身一起存储在数据库中。这可能不是很好。

reddit's hot sort没有考虑到观看次数,因此他们无需在线程的每个视图上进行更新。但是,他们会在每次投票时更新排序值,包括向上,向下或不投票。只要您在单独的队列中执行此操作并拥有足够的队列处理器,它就是一种可以合理扩展的方法。

如果您确实希望在排序计算中包含页面视图,我可能会使用类似于StatsD处理指标的缓冲方法来处理它:在每个页面加载时,将ping发送到可以编写这些内容的某个服务值很快就会记忆,并且服务会定期将这些值一起刷新到更永久的存储。您可以直接使用pixel ping执行此操作,只需编写它刷新的处理程序即可。

相关问题