Appengine ndb是设计每天,每周,每月最高下载量的最佳方式

时间:2017-06-10 15:30:48

标签: python google-app-engine database-design google-cloud-datastore nosql

您好我正在建立一个简单的电影网站,我使用谷歌数据存储作为我的后端。

我需要设计每天,每周,每月,所有时间的顶级电影下载。

现在我只跟踪下载次数,例如:数据库就像一行以num_of_downloads为列的电影,我会在用户下载电影时递增此字段。

Movie Id | Title | Description | num_of_downloads

现在,以每天,每周,每月,所有时间显示热门电影下载的最佳方式是什么。

我正在考虑实施一个带有电影密钥和日期字段的新表来跟踪每天下载的数量,我可以用它来计算其余的问题。

Movie ID, Date,      Downloads
M1        01/01/2017  1000
M2        01/01/2017   100
M1        02/01/2017  2000

我不确定这是设计appengine数据存储区的最佳方法,也是本周编写查询以获得前10名下载,月份很难,因为它不像sql查询那么容易。

3 个答案:

答案 0 :(得分:0)

如果您希望总计100%正确,那么在数据存储区中解决这个问题并不容易。涉及手动更新此类计数器。

更适合您的情况是,在您提供这些请求时,还会将下载数据导出或流式传输到bigquery或Google Analytics。然后,每日一个cron可以计算统计数据并将其缓存在数据存储区或memcached中。

Google Analytics是免费的,但统计数据不准确。 Bigquery有成本,但对于你的情况它们很低,因为它主要是存储(便宜)和每天3个查询(便宜)

答案 1 :(得分:0)

数据存储非常有限,不适合统计。我同意Zig的意见,你应该选择其他服务来解决这个问题。

我建议您只使用Cloud SQL并为每个下载的电影保留一条记录,并将您获得的所有信息添加到该记录中。由于这涉及下载电影的数量,因此数字将受到限制。只要您使用正确的索引和缓存,我就很难想象这会导致任何延迟,定价或配额问题。

如果您希望向我们的用户显示更多指标,或者您希望将其用于内部目的,那么在sql中提供所有信息可能会很方便。

答案 2 :(得分:0)

我会对其他两个答案提出不同意见,并提出可能的应用引擎解决方案。

创建一个实体,用于累积每天的统计数据:

class MovieStats(ndb.Model):
    day = ndb.DateTimeProperty()
    movies = ndb.KeyProperty(repeated=True)

然后,您可以更新每个电影下载当天的MovieStats实体。当然,您需要使用事务执行此操作,并以避免争用的方式执行此操作。一个解决方案是分片计数器,但我真的很喜欢Nick Johnson在两篇博文中描述的解决方案:

我不想在这里重复这些帖子,但基本的想法是,对于每个电影下载,您将一个任务添加到拉队列以更新电影的计数器。然后,每分钟(或其他一段时间),您处理拉取队列中的所有任务并更新事务中的MovieStats实体。

为了处理拉取队列任务,您可以拥有一个每分钟启动的cron作业,或者使用"按需#34; CRON工作如上所述。每次将任务添加到提取队列时,都会创建一个工作任务(常规推送队列)来处理提取队列中的任务。对于worker任务,添加与时间间隔对应的任务名称,以确保在该时间间隔内只有一个worker任务。它允许您获得1分钟CRON作业的好处,但增加的性能奖励仅在需要时运行,因此您不需要在不需要时运行CRON作业。