如何在 Google App Engine 中创建扇出 DeferredTask - JAVA

How to create a fan-out DeferredTask in Google App Engine - JAVA

我有一个 Java App Engine 项目,我正在使用 DeferredTasks 推送队列。

/** A hypothetical expensive operation we want to defer on a background task. */
public static class ExpensiveOperation implements DeferredTask {

  @Override
  public void run() {
    System.out.println("Doing an expensive operation...");
    // expensive operation to be backgrounded goes here
  }
}

我希望能够创建 DeferredTask 的多个分片以获得更多的吞吐量。基本上,我想 运行 一个 DeferredTask,然后 运行 更多的 DeferredTask(最多 1,000 个)。本质上是一个扇出任务。我该怎么做?

一个问题是,在创建任务时,您需要在 queue.yaml 文件中指定它们的名称。但是如果我想要 1,000 个任务,我真的需要在该文件中指定其中的 1,000 个吗?写出“task-1”、“task-2”等会变得非常乏味

有更好的方法吗?

这通常是通过为每个任务指定一个分片参数并重复使用同一个队列来完成的。如您的示例中所述,整个 java 对象使用 DeferredTask 序列化。所以你可以简单地在构造函数中传入你想要的任何值。例如

public static class ShardedOperation implements DeferredTask {
  private final int shard;
  public ShardedOperation(int shard) {
    this.shard = shard;
  }
}
...
@Override
public void run() {
  System.out.println("Fanning out an expensive operation...");
  Queue queue = QueueFactory.getDefaultQueue();
  for (int i = 0; i < 1000; ++i) {
    queue.add(TaskOptions.Builder.withPayload(new ShardedOperation(i)));
  }
}

这与您链接到 https://cloud.google.com/appengine/docs/standard/java/taskqueue/push/creating-tasks#using_the_instead_of_a_worker_service 使用默认队列的部分相匹配。