Google Cloud Data Store-交易

时间:2018-08-08 12:15:23

标签: google-cloud-datastore datastore

我有一个按Cron时间表运行的程序,该程序作为Google云应用的一部分具有以下等效步骤。     #clear Kind1     对于model.Kind1.query()中的p:       p.key.delete()

#repopulate Kind1 with date from Kind2
for p1 in model.Kind2.query():
  a = new Kind1()
  a.key = p1.key
  model.Kind1.put(a)

在阅读时,您会看到Kind1暂时为空白。

Google数据存储区(或环境的另一部分)内部是否有内置方法可以通过此过程创建事务以创建锁形式?我担心所编写的程序可能会在一段时间内无法使用。

另一种想法是使用Kind1查找源并创建一个缓存,该缓存在完成上述过程后会失效。

关于如何处理此问题还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

非祖先查询最终在Cloud Datastore中是一致的,这使此问题更具挑战性。最终,当Firestore upgrade发生时,这将改变。回想一下,最终的一致性意味着非祖先查询的结果可能会在任意且不可知的时间内过时。

要解决最终的一致性问题,您必须将实体放入一个共同的祖先,然后对其进行查询。该组的写入速率限制为每秒约1个写入-如果您必须以比集合更快的速度写入集合,则需要添加其他祖先分片。

一旦您使用一致的查询,这就是一种解决方案:

  1. 创建一个Kind1集合的新实例,以新名称进行查询。通过查询Kind2来填充它。
  2. 查询此集合的任何内容都会读取另一个实体,并使用它来确定要使用的查询-您可以更新该实体以指向新名称。让客户读取该实体,以决定要查询的集合(您可以将该实体粘贴到内存缓存中,并定期刷新它)。

另一种选择是创建一个适当的复合索引,该索引使您可以直接查询Kind2,而不必将其复制过来。