Google Cloud Datastore是否支持原子操作,对于计数器等?我在文档中没有看到任何内容,我注意到更新基本上是获取整个对象,更新字段,然后将整个对象发送回来,这似乎会使原子操作无法进行。 https://cloud.google.com/datastore/docs/concepts/entities#Datastore_Updating_an_entity
答案 0 :(得分:5)
不是直接的,但您可以使用transactions模拟原子增量操作。在最简单的情况下,您使用单个实体并使用事务读取+写入递增。如果存在并发增量,则此类事务将失败,因此计数器不能很好地扩展。相反,您可以使用[('Counter', 'MyCounterX'), ('Elt', 'k')]
形式的键对n个实体进行操作,对于某个数字k,以及属性' Count':
要递增,请选择1到n之间的随机数,然后尝试事务读取+写入。如果密钥不存在,则在count = 1的给定密钥上写一个新实体。如果事务失败,您可以使用新的随机数重试。您还可以包含应用程序的逻辑,以便在它开始频繁发生争用时立即增加n。
要检索计数,请使用root [(' Counter',' MyCounterX')]执行祖先查询,并在Count属性上投影,然后将所有计数相加
您可以在第二个块here中看到实现此功能的代码。
答案 1 :(得分:1)
将您的更新放入有序队列(例如Google Pub / Sub)中,并且具有单个处理器/服务,这是唯一具有写许可权的服务。这种方法的优点是您可以根据保存的数据和查询需求而不是原子/酸的需求来选择持久性平台。
一个更简单(更便宜)的方法是使用Background Function which is triggered by Pub/Sub,因此指定的无服务器功能会接收来自Pub / Sub的消息,而您只需要专注于编写增量逻辑即可。