0

假设一个应用程序每 10 分钟收集一次全球各个城市的实时温度数据。

使用以下 GAE 数据存储模型,

class City(db.Model):
    name = db.StringProperty()

class DailyTempData(db.Model):
    date = db.DateProperty()
    temp_readings = db.ListProperty(float, indexed=False) # appended every 10 minutes

和一个 cron.yaml 一样,

cron:
- description: read temperature
  url: /cron/read_temps
  schedule: every 10 minutes

我已经达到了 GAE 的数据存储写入每日免费配额,我正在寻找解决这个问题的方法。

我正在考虑通过仅在每天结束时持久保存温度数据来减少我的数据存储写入,这将有效地将每日写入量(每个城市)从 144 次减少到 1 次。

一种方法是使用 memcache 作为临时暂存器,但由于随机数据驱逐的可能性,我很可能会丢失当天的所有数据。(除了问题:根据经验,计划外驱逐真正发生的频率是多少?)

问题如下:

  1. 是否有这样的内存/存储设施(在 cron 作业中持久且有保证)可以让我减少所描述的数据存储写入?
  2. 如果没有,有什么替代解决方案?

唯一的其他要求是温度读数必须在一天中的任何给定时间都可以访问(以提供给客户端)。

4

2 回答 2

2

数据存储中唯一有保证的存储。

至于 memcache 驱逐 - 这取决于在您的应用程序和 google appengine 领域中发生了什么,驱逐可能在一两分钟或几小时后发生。在我的 appengine 实例中,我通常有大约 2 小时前的最旧项目。但这一切都取决于你不能依赖它。

任务队列有效负载约为 10K。

您可以只写一个 blob(包含在 10 分钟间隔内测量的所有城市),然后重新处理它并取消选择它,并在一天结束时写出城市详细信息。

当您说客户必须能够访问温度读数时,您是指当前的读数还是当天的所有读数。

于 2013-05-08T04:32:45.570 回答
1

您还可以更改模型,以便为每次执行或 cron 存储一个巨大的对象。我的意思是,不仅仅是每个城市。例如,假设该对象称为Measures...Measures 项目将包含相应时间的所有度量的列表。将它们存储为非索引属性,你应该没有问题......而且每天只有 144 次写入。

对于阅读部分... 使用 memcache 来存储度量项,作为一种很好的使用模式。

于 2013-05-08T19:08:04.973 回答