2013-05-08 67 views
0

假设一个应用程序,每10分钟收集世界各地的实时温度数据。存储(内存)替代GAE数据存储(memcache)跨cron作业持久

使用下面的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. 如果不是,可以采用哪些替代解决方案?

唯一的另一个要求是温度读数必须可以在任何给定时间访问(用于客户端)。

+0

不知道这应该downvote。 – 2013-05-08 07:27:56

回答

1

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

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

+0

谢谢,昨天也试过了。我认为这是最好的解决方案。使用带有{'城市'的词典:[今天的温度读数列表],...}格式,全部腌制成一个blob。有趣的是,Google通过限制我们的数据存储使用量迫使我们采用这种解决方案。 – silvernightstar 2013-05-10 01:32:44

2

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

至于memcache驱逐 - 这取决于发生了什么,在您的应用程序和谷歌appengine土地,驱逐可能在一两分钟或几小时后。在我的appengine例子中,我通常会在大约2个小时的时候坐着最古老的东西。但这一切都取决于你,你不能依靠它。

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

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

当你说客户必须能够读取温度读数时,你的意思是当前或当天的所有读数。

+0

我指的是当天的所有读数(针对特定城市和日期范围的查询,包括今天迄今为止的可用读数)。如果我正确理解了你的建议,那么你的解决方案似乎会增加阅读量(最坏的情况下是144倍到1,因为一个城市的温度读数现在分布在144个blob中)会受到惩罚?但是由于读取问题更适合使用memcache(比写入更容易),使用memcache支持10分钟间隔blob应该能解决我的问题吗? – silvernightstar 2013-05-08 05:49:15

+0

我现在就试试看看读取的性能是否可以接受 – silvernightstar 2013-05-08 08:08:45