【问题标题】:Reddit-like hot page backend architecture类似 Reddit 的热页后端架构
【发布时间】:2016-02-19 06:02:19
【问题描述】:

我正在尝试对 reddit 如何计算和提供热页面进行后端设计。我还使用“热门”评级来订购我网站上的帖子。我有一些我正在努力克服的问题。以下是我认为可能有意义的一些设计方式:

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

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

这是一个困扰我多年的问题,我正在尝试找到一个合适的解决方案,了解如何最好和最有效地计算热门评分值并按热门评分的顺序获取帖子而不改变值(为了避免重复和可能丢失的帖子)当我向下滚动页面并加载新的帖子集时,同时保持过程良好和高效。对此有什么想法吗?

【问题讨论】:

    标签: architecture reddit


    【解决方案1】:

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

    我认为没有一个可以很好扩展的解决方案。大多数网站更看重性能和可扩展性而不是一致性。这就是为什么 nosql 在这类事情上越来越受欢迎的原因。它们不保证一致性(或仅保证最终一致性),但提供更好的性能和水平可扩展性作为回报。

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

    【讨论】:

    • 我实际上已经将用户看到的帖子存储为会话变量,这确实工作得很好,只是它的工作方式在某些情况下可能存在缺陷,尤其是在移动设备中,无论出于何种原因有时变量会在中间的某个地方被清空。也许使用它并对其进行调整是最好的方法。还有关于计算热值的任何想法吗?在 cronjob 中执行此操作并将这些值保存在 memcached 中会更好吗?
    • 为了计算热值,我会使用 cron 方法,特别是因为时间可能是“热度”计算的一个重要方面。它也是最一致和最容易调整的。如果计算影响性能,您可以例如暂时只是降低计算频率。
    • 当您将显示的帖子存储为会话变量时,这仍然是服务器端的。我的意思是让客户端决定实际添加哪些帖子。它可以例如查看其 DOM 以验证哪些帖子已显示。如果用户向下滚动很远或需要很长时间,我不确定该怎么做,以便服务器的大部分回复已经显示。在这种情况下,来自服务器的所有回复都可能已经显示,而当前最热门的回复不再返回。在那种情况下,也许客户可以再次开始请求最热门的帖子?
    • 哦,我明白你在说什么了。我也在考虑类似的事情。我只是在思考如何实施它时遇到了麻烦。有什么想法吗?
    【解决方案2】:

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

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

    计算热值:目前我正在计算值并将其与投票本身一起存储在数据库中,每次有人对帖子进行投票或有人加载帖子时。这可能不太好。

    reddit's hot sort 不考虑视图数量,因此无需在线程的每个视图上更新。但是,它们确实会在每次投票时更新排序值,无论是向上、向下还是取消投票。只要您在单独的队列中执行此操作并有足够的队列处理器,这是一种可扩展的方法。

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

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多