有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我应该使用任务队列将文档添加到AppEngine上的索引中吗

通常的情况是:我有一个由我的数据存储支持的com.google.appengine.api.search.Index。对于每个文档,documentId是某个实体的键。(为了可视化,假设我有一个产品“表”,每个产品都有许多评论。因此每个文档都是一个产品,包含描述性数据和附带的评论。所以…)

因此,对于那些知道的人来说,每次更新文档时,实际上都是在重新创建文档。我想在每次用户添加评论时更新文档。但我想避免比赛条件。但如果我使用任务队列,我将如何设计它?如中所示,它应该是单个队列还是多个队列?如果有多个队列,如何避免数据交错?也就是说,两个不同的队列同时更新同一文档


共 (2) 个答案

  1. # 1 楼答案

    写入数据存储时避免竞争条件的答案与传统数据库相同:transactions。您可以轻松地使用事务绕过您提出的竞争条件。不需要使用任务队列。事务将确保如果您的产品在操作的中间被更新,您的操作将失败。{a2}(这是一个很好的选择)将自动重试

    但是,如果您担心写争用,首先要知道的是:数据存储不能在单个实体(甚至entity group)上处理太多的写吞吐量。如果需要处理超过one or two writes per second的数据,则需要拆分数据。在您的示例中,我认为您应该将每个注释存储为单独的实体。这将消除所有写争用。您只需要在注释中包含产品的ID,并确保该字段已编入索引。然后,当您需要一个产品及其注释时,您可以一次查询所有这些内容

    此外,仅供参考,单个任务队列并不意味着一次只能执行该队列中的一个任务(除非您专门以这种方式进行设置)。有多个选项可用于限制队列允许通过任务的速率。文件是here

  2. # 2 楼答案

    我假设每次添加新的查看时,您都会更新产品实体(可能您在产品实体中有一个查看键列表)

    我不确定是否理解“多队列”方法,但如果您在数据存储事务中更新产品实体,则可以enqueue a task重新创建文档。这样,您可以确保只有在产品成功更新并且文档的更新可以序列化的情况下,文档才被“更新”

    这假设您在产品实体上没有太多争用