设计可扩展的点击/分析系统的最佳方式?

8 php mysql time analytics date

我工作的公司为Blackberry平台创建应用程序.

我们一直在研究专有的"分析系统",它允许我们在我们的应用程序中嵌入代码,并让应用程序在每次运行时向我们的中央服务器报告一些统计信息.目前,系统运行正常; 但它只是在测试版中,每小时100-200次点击."命中"会毫无问题地发送到服务器.我们已经构建了一个非常可靠的API来处理命中的接受和存储(在MySQL数据库中).我们测试了负载,我们应该能够每小时容纳数十万次点击而没有问题.这不是一个真正的问题.

问题是显示统计数据.我们已经建立了一个类似于Mint(hasamint.com)的显示面板,它显示了每小时,过去几天,几个月,几周,几年等的点击量.第一个版本直接查询从命中表中提取数据并在运行中解释它.这不会持续很长时间.我们目前的解决方案是命中"排队"进行处理,我们每隔5分钟就有一个cron来点击并将它们分成每个小时,每天,每周,每月,每年等等的"缓存".这非常有效,并且具有令人难以置信的可扩展性; 但是,它仅适用于1个时区.由于整个公司都可以访问这个,我们正在处理各个时区的几百个用户.我在圣何塞定义的"今天"与我在伦敦的同事定义为今天的情况大不相同.由于当前的解决方案只缓存到1个时区,对于那些在我们的时区之外检查数据的人来说,这是一场噩梦.

我们目前解决这个问题的计划是为每个时区创建缓存(总共40个); 然而,这意味着我们将数据量乘以40 ......这对我来说太糟糕了,并且考虑到缓存可能非常大,增加它只是听起来像个坏主意; 另外,当我们去处理队列时,将需要更多的CPU时间将它们放入40个不同的缓存中.

还有谁能更好地了解如何解决这个问题?

(抱歉这么长的问题......解释起来并不容易.谢谢大家!)

ale*_*emb 4

您提出的解决方案有太多冗余。我建议您将数据存储在至少 30 分钟的存储桶中,而不是每小时,并将时区标准化为 UTC。

对于 30 分钟存储桶,如果用户请求 -4.5 UTC 的下午 1 - 2 点的每小时数据,您可以从系统中获取下午 5:30 - 6:30 的数据并显示该数据。如果您以一小时为增量存储数据,则无法为时差为 N + 0.5 小时的时区的用户提供服务请求。

对于每日数字,您需要合计 48 个半小时时段。选择的时段将由用户的时区决定。

当您获取年度数据时,情况会变得很有趣,因为您最终必须聚合 17,520 个半小时的数据桶。为了简化计算,我建议您获取每个 UTC 时间的预聚合年度数据,并减去一年中第一个 4.5 小时的聚合数据,并添加下一年前 4.5 小时的聚合数据。这实际上会使全年减少 4.5 个小时,但工作量并没有那么多。从这里开始,您可以进一步调整系统。

编辑:原来加德满都是 +5.45 GMT,因此您需要将数据存储在 15 分钟的存储桶中,而不是 30 分钟的存储桶中。

编辑 2:另一个简单的改进是每年汇总,因此您不必每次添加 17,520 个存储桶,也不需要每个国家/地区进行一次汇总。汇总1月2日至12月30日的年度数据。由于任何两个国家之间的最大时区差异为23小时,这意味着您可以获取年度数据(1月2日至12月30日)并在前后添加一些存储桶作为适当的。例如,对于 -5 UTC 时区,您可以添加 1 月 1 日 0500 点之后的所有存储桶、12 月 31 日以及下一年 1 月 1 日 0500 点之前的所有存储桶。