GAE数据存储(memcache)的存储(内存)替代方案在cron作业中持久存在

时间:2013-05-08 03:40:59

标签: google-app-engine google-cloud-datastore

假设一个应用程序每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. 如果没有,可能会有哪些替代解决方案?
  3. 唯一的另一个要求是温度读数必须在任何给定的时间都可以访问(服务于客户端)。

2 个答案:

答案 0 :(得分:2)

数据存储区中唯一保证的存储空间。

关于内存卡驱逐 - 它取决于发生了什么,在你的应用程序和谷歌的发动机土地上,驱逐可能在一两分钟或几小时之后。在我的appengine实例中,我通常有最旧的物品,大约2个小时左右。但这一切都取决于你,你不能依赖它。

任务队列的有效载荷大约是10K。

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

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

答案 1 :(得分:1)

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

对于阅读部分...使用memcache存储Measures项目,作为良好的使用模式。