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

我们一直致力于开发专有的“分析系统”,该系统允许我们将代码嵌入到应用程序中,并让应用程序在每次运行时向我们的中央服务器报告一些统计数据。目前,系统运行正常;然而,它还处于测试阶段,每小时点击次数为 100-200 次。“点击”会毫无问题地发送到服务器。我们构建了一个非常可靠的 API 来处理点击的接受和存储(在 MySQL 数据库中)。我们已经测试了负载,应该能够毫无问题地容纳每小时数十万次点击。这并不是什么问题。

问题是显示统计数据。我们构建了一个类似于 Mint (haveamint.com) 的显示面板,它显示每小时、过去几天、几个月、几周、几年等的点击率。第一个版本运行直接查询,从命中表中提取数据并即时解释它。这并没有持续很长时间。我们当前的解决方案是,点击量被“排队”进行处理,并且我们每 5 分钟就会有一个 cron 来获取点击量,并将它们按每小时、每天、每周、每月、每年等分类到“缓存”中。这非常有效,并且具有令人难以置信的可扩展性;但是,它仅适用于 1 个时区。由于整个公司都可以访问此内容,因此我们正在与不同时区的数百名用户打交道。我在圣何塞定义的“今天”与我在伦敦的同事定义的“今天”有很大不同。由于当前的解决方案仅缓存到 1 个时区,因此对于任何在我们的时区之外检查数据的人来说都是一场噩梦。

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

还有人对如何解决这个问题有更好的想法吗?

(抱歉问了这么长的问题……这并不容易解释。谢谢大家!)

有帮助吗?

解决方案

您提出的解决方案有太多冗余。我建议您将数据存储在至少 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 点之前的所有存储桶。

其他提示

在设计触及多个时区的软件,我说你的日期/时间总是存储在 UTC与原来的时区另一场并有一个功能,需要的时间并将其转换为从UTC /时区。你会为自己省下不少麻烦来处理日期开关,夏令时,人们从一个国家从地球的另一边看着统计的不同情况等等....

在您的情况下,具有在UTC的高速缓存和刚刚调整UTC转换应该帮助的请求。不要一个统计存储为“今天”,它存储时间00:00:00UTC到23:59:59UTC,当有人问在纽约的统计今天,做转换

据我所看到的,你正在寻找一个数据仓库系统,这里的存储部件(您的报告将是前端)。

其实,路商业系统正在做的,是你所描述的缓存:Preaggregate表,并创建它们的缓存。加快您的查询的唯一方法是使数据库系统少做他们。这意味着较少的数据,这又意味着在索引迭代所述数据或更少的数据花费的时间更少。

这就是说,我要么提出“40缓存解决方案”(是真有超过24时区)。你应该能够通过创建数据的副本至平凡并行排序队列中。

另一种方式来做到这一点,将在小时粒度缓存,然后汇总小时后天(或30分钟,如果你的时区需要这一点)。这意味着你缓存在更细的粒度比你的日常缓存,但在比原始数据更大的粒度。

此类型的数据,使用循环或圆形数据库通常存储。检查这个 http://www.shinguz.ch/MySQL/mysql_20070223.html 和这 HTTP://techblog.tilllate。 COM / 2008/06 /第22 /循环赛,数据存储在MySQL的/ 知道他们是如何工作的,以及如何在MySQL下实现它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top