为什么大多数网站上的邮件视图计数比较慢?


10

请注意,YouTube视频的观看次数总是很慢吗?例如,一个视频有1000条评论,但仍具有500次匹配,几小时后将具有10000次点击。

YouTube并不孤单。大多数留言板都是以这种方式实现的,并且视图计数每10分钟左右更新一次。

有谁知道背后的原因吗?

谢谢。

Answers:


20

记录视图非常简单,只需在表中添加代表“视图”操作的行即可。这是快速的,因为数据库中不需要锁定,您只需要在堆的末尾添加一行即可。

将其汇总到视图总数中需要执行类似操作,SELECT COUNT(*) FROM ...这意味着您必须在计算进行时锁定表。另外,UPDATE ... SET num_views = num_views + 1还要求您每次有人查看时都锁定该特定行。

因此,从可伸缩性的角度来看,每次有人观看视频时添加一行,然后SELECT COUNT(*) FROM ...每隔十分钟执行一次,这样效率更高。

注意:我真的不知道的YouTube的架构,还是他们甚至使用关系数据库来存储数据,但无论他们应用,其原理可能是相同的:插入数据是便宜,汇总值是(相对)昂贵。


4
它不是将BigTable与Google的其余部分一起使用吗?
TheLQ 2011年

@Dean Harding谢谢,但这不是意味着即使流量适中,该表也将拥有数十亿甚至数十亿的网站记录,而youtube却少得多?有了如此大量的记录,我怀疑SELECT COUNT(*)即使仅每10分钟运行一次,也会对数据库产生性能影响。这也将需要更多磁盘空间用于数据库和备份。我并不是说在每次点击时都锁定表格会更好,但是我很难理解大型网站将如何处理如此庞大的数据。
汤姆·塔克

这不是我第一次听到这个消息。真正令我困惑的是,与追加到列表相比,以线程安全的方式增加计数器更难或更昂贵。如果可以解决后者,那么前者应该很容易。
back2dos

2
@Tom Tucker:是的,但是我们在这里谈论的是Google,请记住:-)我以较小规模解决此问题的一种方法是,一旦完成聚合,我将截断该聚合的表计算数据。因此,您获得的原始数据永远不会超过一个小时(或更新间隔是一个小时)。
迪恩·哈丁

4
另外请记住,“动作”表中的数据不仅可以用于计算“视图数”,还可以用于更多数据。您也可以使用它来实现IP块(即“同一IP每10秒不超过1条注释”)。您还可以生成图表,以显示随时间推移的视图数量,以及其他简单num_views = num_views + 1不允许的事情。
迪恩·哈丁

8

该值很可能已被沿途缓存在某处,因此您会看到过时的数据。由于此数据的准确性并不重要,因此开发人员已决定优先考虑性能而不是获取最新数据。您确实不希望进入数据库并对网站上的每次点击都进行行计数,只是为了更新此数字,所以他们没有这样做,他们只是缓存了一段时间。


4

为了扩展大型站点,它们必须在多个阶段执行缓存。可以是页面缓存,子页面缓存和/或记录缓存。您可能将所有这些组合在一起有效。例如,如果youtube页面被缓存直到添加新评论,您就会看到有些滞后直到有人发表评论。

有几种测量页面浏览量的方法:

  • 将其作为记录存储在数据库中:易于插入,但是对于仅提供计数的记录,这是主要的维护开销。
  • 将其作为记录存储在数据库中,并定期汇总计数:易于插入,批处理以收集所需的统计信息,并自行清除。
  • 更新数据库中的一个计数列:更新成本高(假定行锁定),没有维护开销,与多个人同时请求同一页时处理负面性能。
  • 过渡时处理访问日志文件:数据库中没有多余的数据,所有处理都离线进行批处理,并且所需的摘要统计信息将在适当时候更新。

在上述项目中,除一个选项之外的所有选项都建议更新将分批完成。视图数并不是真正的时间关键属性,因此可以。但是,由于后端数据库无法跟上来,让人们等待在YouTube上观看视频一项时间紧迫的措施。这意味着更新数据库中的列不适用于像YouTube这样大的网站。如果他们选择了最终选择,我个人不会感到惊讶。Web服务器将为每次访问记录大量信息,包括您正在使用的IP,如何引用您的页面等。仅批量处理这些信息并根据需要汇总结果才有意义。


没想到最后一个解决方案-非常聪明!仅此一项就值得+1。
汤姆·塔克

1
我们使用该方法来处理每天/每周/每月的滚动“最受欢迎”页面列表。我们将计数汇总到一个简单的属性文件中需要数天,数周和数月。当前一天将每小时进行一次重新处理,其余的摘要文件将被视为祖父/父亲/儿子备份磁带。基本上,我们需要的摘要文件不超过8个(每周摘要,以及当前一周中每天的摘要文件)。
Berin Loritsch 2011年

这与RRDTool的工作原理类似,尽管RRDTool的简洁性比您的解决方案复杂得多。
约尔格W¯¯米塔格

0

这可能是由于多种原因。归结为每个网站使用的算法。除非这里的人实际上是YouTube开发人员,否则我怀疑您会在这里获得确切的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.