【问题标题】:Storage(memory) alternatives to GAE datastore(memcache) persistent across cron jobsGAE 数据存储(memcache)的存储(内存)替代方案在 cron 作业中持久存在
【发布时间】:2023-03-19 19:58:01
【问题描述】:

假设有一款应用每 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. 如果不是,还有什么替代解决方案?

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

【问题讨论】:

  • 不确定这值得否决。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我指的是当天的所有读数(针对特定城市和日期范围的查询,包括今天迄今为止可用的读数)。如果我正确理解您的建议,您的解决方案似乎会带来读取量增加的惩罚(最坏的情况是 144 倍比 1,因为一个城市的温度读数现在分布在 144 个 blob 中)?但是由于读取问题更适合使用 memcache(而不是写入)来解决,所以使用 memcache 支持 10 分钟间隔 blob 应该可以解决我的问题吗?
  • 我先试试这个,看看读取性能是否可以接受
【解决方案2】:

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

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

【讨论】:

  • 谢谢,昨天也试过了。我认为这是最好的解决方案。使用带有 {'city' 的字典:[今天的临时读数列表],...} 格式,全部腌制成一个 blob。有趣的是,Google 如何通过限制我们的数据存储使用来迫使我们采用这种解决方案。
猜你喜欢
  • 2012-06-15
  • 2014-11-27
  • 2011-04-27
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多