有没有办法在 Google Cloud Datastore 中执行阻塞 get() 调用?
Is there a way to execute a blocking get() call in Google Cloud Datastore?
我有一个操作需要以下内容:
- 使用 Google Cloud Datastore
从键获取实体
- 进行约 10 秒的资源 (CPU/memory) 密集型工作
- 在 Google Cloud Datastore
中使用结果更新实体
理想情况下,为了最大限度地减少资源使用,如果已经有另一个工作人员正在处理 #2,我什至不希望程序开始执行 #2。
这意味着 get()
调用将阻塞,直到没有其他人正在处理 #2。
我从 docs 和数据存储的 Transaction
实验中了解到,在 commit()
调用之前不会发生任何争用检查。只有这样才会抛出错误并发生回滚。但这意味着每个工人在意识到其他人已经在做这项工作之前就执行了代价高昂的第 2 步。
如果其他人有使用该密钥的交易,是否有办法阻止 get()
调用?
在this article中,他们利用内存缓存。但是,如果可能的话,我更愿意将其保留在 Cloud Datastore 中,以尽量减少额外的基础设施。
事务的目标是准备写入,然后在事务提交时有效地写入,或者在回滚时取消更改。
读不阻塞,只有写操作。
您有 2 个解决方案:
- 您必须将实体 ID 存储在某个地方,例如存储在内存中。
你可以依靠你的处理时间来做这个过程
- 获取实体
- 在您的实体(任何人)中写一个字段
- 设置写入持续时间超时,例如 500 毫秒。 (在 Go 中很容易做到,我不知道用其他语言)。如果达到超时,则该实体上的事务已在进行中,请跳过该实体。如果没有,继续
- 创建交易
- 执行你的强化过程
- 写出结果
- 提交交易
然而,在这两种情况下,在同时发生的情况下你仍然有竞争条件
我有一个操作需要以下内容:
- 使用 Google Cloud Datastore 从键获取实体
- 进行约 10 秒的资源 (CPU/memory) 密集型工作
- 在 Google Cloud Datastore 中使用结果更新实体
理想情况下,为了最大限度地减少资源使用,如果已经有另一个工作人员正在处理 #2,我什至不希望程序开始执行 #2。
这意味着 get()
调用将阻塞,直到没有其他人正在处理 #2。
我从 docs 和数据存储的 Transaction
实验中了解到,在 commit()
调用之前不会发生任何争用检查。只有这样才会抛出错误并发生回滚。但这意味着每个工人在意识到其他人已经在做这项工作之前就执行了代价高昂的第 2 步。
如果其他人有使用该密钥的交易,是否有办法阻止 get()
调用?
在this article中,他们利用内存缓存。但是,如果可能的话,我更愿意将其保留在 Cloud Datastore 中,以尽量减少额外的基础设施。
事务的目标是准备写入,然后在事务提交时有效地写入,或者在回滚时取消更改。
读不阻塞,只有写操作。
您有 2 个解决方案:
- 您必须将实体 ID 存储在某个地方,例如存储在内存中。
你可以依靠你的处理时间来做这个过程
- 获取实体
- 在您的实体(任何人)中写一个字段
- 设置写入持续时间超时,例如 500 毫秒。 (在 Go 中很容易做到,我不知道用其他语言)。如果达到超时,则该实体上的事务已在进行中,请跳过该实体。如果没有,继续
- 创建交易
- 执行你的强化过程
- 写出结果
- 提交交易
然而,在这两种情况下,在同时发生的情况下你仍然有竞争条件