【问题标题】:GAE/P: Storing list of keys to guarantee getting up to date dataGAE/P:存储密钥列表以保证获取最新数据
【发布时间】:2015-10-02 20:35:31
【问题描述】:

在我的 Google App Engine 应用中,我有大量代表人的实体。在某些时候,我想处理这些实体,拥有最新数据非常重要。太多了,无法将它们放在同一个实体组中或进行跨组事务。

作为一种解决方案,我正在考虑在 Google Cloud Storage 中存储一个密钥列表。我实际上使用此人的电子邮件地址作为键名,因此我可以将电子邮件地址列表存储在文本文件中。

当我想处理所有实体时,我可以执行以下操作:

  1. 从 Google Cloud Storage 读取文件
  2. 批量迭代文件(比如 100 次)
  3. 使用ndb.get_multi() 获取实体(这将始终提供最新数据)
  4. 处理实体
  5. 重复下一批直到完成

这个过程有什么问题吗?或者有更好的方法吗?

【问题讨论】:

  • 您的密钥列表会经常更改吗?如果是这样,您不只是将问题推向确保您拥有高度一致的键列表吗?
  • 我根本不明白这如何解决您的问题。您打算如何更新文件?
  • 更新文件不是问题。该文件在创建新实体之前更新。新实体的创建相对较少。
  • 为什么不为所有的人添加一个共同的祖先并进行祖先查询。如果这似乎不可行,我会抛出一些奇怪的东西:分片祖先。将您的人员实体均匀分布在祖先的分片上,当您需要最新数据时,祖先会查询这些分片。这只是一个想法,但也许值得一试。
  • @konqi,有趣的想法,但实现起来似乎很复杂。我得再考虑一下。

标签: python google-app-engine google-cloud-datastore eventual-consistency


【解决方案1】:

如果,就像您在 cmets 中所说,您的列表很少更改并且不能使用祖先(我假设是因为系统其余部分的写入频率),那么您提出的解决方案可以正常工作。您可以执行任意次数的 get(multi),并且可以根据需要执行任意次数,datastore 可以处理它。

既然您提到您可以根据需要更新密钥列表,那将是一个很好的方法。 您可以流式读取一个大文件(例如从云存储中每行一行)并使用数据存储异步读取来快速完成或使用谷歌云数据流进行读取和处理/合并。 数据流还可用于即时生成云存储中的密钥列表文件。

【讨论】:

    【解决方案2】:

    您可能不需要编写自己的解决方案,有许多库可帮助您在 App Engine 上处理大量实体。 您可以使用map reduce 进行操作,尽管现在首选的方式是通过Google App Engine Pipeline API

    【讨论】:

    • 我关心的是确保我得到最新的数据(避免最终的一致性),我认为 map reduce 不会这样做。此外,我没有太多需要 map reduce 的数据,只是太多数据无法放入单个实体组或事务中。
    • 这没有回答问题。欧普是对的。您不能使用 MapReduce,因为只有通过按键才能获得新的结果。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多