如何在循环中为顺序异步Objectify save()操作实现障碍

时间:2019-01-28 20:44:12

标签: google-app-engine objectify appengine-pipeline

我们的团队拥有一个GAE管道,其中GenerateJob可以生成并将大量MyEntity保存到Datastore中。当前save中的GenerateJob操作是在for循环中使用ofy().save().entity().now()顺序地和同步地完成的。我们希望通过将循环更改为ofy().save().entity()进行异步处理来缩短运行时间。

但是,稍后在管道中,我们还有另一项工作,读取所有这些条目并进行处理。我们如何实现等待所有save操作的障碍? ObjectifyFilter.complete()在这种情况下可以工作吗?像这样:

public class JobA {
  public void generate(MyInput input) {
    for (MyEntity entity : processInput(input)) {
      // ... Additional work for entity.

      addResult(entity);
    }

    // Will ObjectifyFilter.complete() work as a barrier here?
  }

  public void addResult(MyEntity entity) {
    // Change to ofy().save().entity(entity) for async ops?
    ofy().save().entity(entity).now();
  }
}

public void JobB {
  public void someWorkOnMyEntities() {
    // Need to make sure all the previous save() operations are finished.
    Iterable<MyEntity> entities = ofy().load().type(MyEntity.class);
    // ... processing logic.
  }
}

1 个答案:

答案 0 :(得分:0)

首先,看看ofy().defer().save()。这将在事务(或会话)结束时将一堆保存操作批处理为一个批量操作。如果您想确定当前进度,也可以定期致电flush()

但是,弄清楚如何在分布式系统中的服务器之间的作业之间创建某种写障碍并非易事。 Objectify没有提供任何帮助,但是Objectify是一个低级API。您将需要更高层次的知识来了解您的工作队列的工作原理。