通常的故事:我的数据存储区支持u.`user_id`
。对于每个文档,documentId是某个实体的关键。 (对于可视化,想象一下我有一个产品“表”,每个产品都有很多评论。所以每个文档都是一个带有描述数据和附带评论的产品。所以......)
因此,对于那些知道的人,每次更新文档时,您实际上都在重新创建它。我想在每次用户添加评论时更新文档。但我想避免竞争条件。但是,如果我使用任务队列,我将如何设计?应该是单个队列还是多个队列?如果有多个队列,我该如何避免数据交错?也就是说,两个不同的队列同时更新同一个文件?
答案 0 :(得分:0)
我假设每次添加新的评论时都会更新产品实体(也许您的评论键列表在< em>产品实体)?
我不确定我是否了解“多个队列”方法,但如果您在数据存储区事务中更新产品实体,则可以enqueue a task重新创建文档 。这样,如果产品成功更新并且文档的更新可以序列化,则可以确保文档仅“更新”。< / p>
这假设您的产品实体没有很多争用。
答案 1 :(得分:0)
写入数据存储区时避免竞争条件的答案与传统数据库相同:transactions。您可以轻松使用交易来绕过您提出的竞争条件。无需使用任务队列。该事务将确保如果您的产品在操作过程中更新,您的操作将失败。 Objectify(这是一个很好的选择)然后会自动重试它。
如果您担心写入争用,首先要知道的是:数据存储无法处理单个实体(甚至entity group)的大量写入吞吐量。如果您需要处理的时间超过one or two writes per second,则需要拆分数据。在您的示例中,我认为您应该将每个注释存储为单独的实体。这将消除所有写入争用。您只需要在评论中包含产品的ID,并确保该字段已编入索引。然后,当您需要产品及其评论时,您可以立即查询所有产品。
另外,FYI,单个任务队列并不意味着一次只能执行该队列中的一个任务(除非您专门设置它)。有多种选项可用于限制队列执行任务的速率。文档为here。