考虑到客户来自数百万行的时区,进行日间聚合

时间:2015-04-21 03:27:13

标签: mysql bigdata web-analytics

假设我有一个表格,其中存储了访问者(网站访问者)的信息。假设,表结构由以下字段组成:

  
      
  1. ID
  2.   
  3. visitor_id
  4.   
  5. visit_time(自UTC以来以毫秒为单位存储       '1970-01-01 00:00:00')
  6.   

这张表中有数百万行,而且还在增长。

在这种情况下,如果我想从任何时区看到报告(与访问者对比),那么一个解决方案就是:

解决方案#1:

  1. 获取报告查看器(即客户端)的时区
  2. 考虑客户的时区
  3. 汇总此表中的数据
  4. 明天显示结果
  5. 但在这种情况下,性能会降低。另一种解决方案可能如下:

    解决方案#2:

    • 使用预聚合表/摘要表,忽略客户的时区

    但在任何一种情况下都有一个trade off between performance and correctness

    解决方案#1 确保正确性,解决方案#2 可确保更好的性能。

    我想知道这个特定场景中的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

当您进入分布式系统,用户以及各种数据源之间的匹配事件时,处理时间的问题会相当多。

我强烈建议您确保所有日志记录系统都使用UTC。这允许从位于世界任何地方的任何种类的服务器(它们都希望与当前UTC时间的视图保持同步)进行收集。

然后,当请求进入时,您可以从用户时区转换为UTC。此时您有相同的决定 - 执行实时查询或者可能访问先前汇总的一些数据。

您是否要提前汇总数据取决于一堆事情。其中一些可能需要能够减少保留的数据量,减少支持查询的处理量,执行查询的频率,甚至构建系统的成本与可能看到的使用量。

关于最佳实践 - 保持显示特性(例如时区)独立于数据处理。

如果您还没有,请务必考虑您保留的数据的有效期。您需要十年的后备数据吗?希望不是。当不再需要旧数据时,您是否有策略来剔除旧数据?如果您存储每条记录(估算各种流量增长率),您知道您将拥有多少数据吗?

同样,大型数据集的最佳实践是了解您将如何处理大小以及如何随着时间的推移逐步管理该数据。这可能涉及长期存储,删除或可能缩减为汇总形式。

哦,并且在一个矩阵类比中,真正要用“正确性”来烘烤你的面条的事实是正确性在这里没有问题。每个时区在他们自己的区域中的“日期”中具有不同的流量视图,并且每个时区都是“正确的”。甚至那些与你的时区不同的奇怪时区也只是以小时为单位进行调整。