使用 App Engine Python 运行时对后台任务进行排队时,您可以为队列指定一个目标,该队列将发送要在特定服务、版本或实例上运行的任务:
task = taskqueue.add(
url='/update_counter',
target='worker',
params={'amount': amount})
有没有办法在Java中做到这一点?该文档提到了target
参数,但没有显示如何使用它的示例。Queue.add
方法没有target
的选项。TaskOptions
类也没有看起来像target
的东西。
这个问题记录了如何使用target
,但答案是在queue.xml
中配置它。我想在运行时选择目标,比如 Python。
TL;DR- 根据早期版本的文档,可能有一种方法可以执行此操作,但最新版本的文档中未对此进行描述。
基于最新文档的方法
根据有关推送队列的最新文档(如您所提到的),您可以在每个队列queue.xml
中配置目标模块、版本。如果指定,则任务请求将发送到指定目标。正如您已经描述的,这是一个静态配置,并不能真正回答您的问题(为了完整起见而描述)。
<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
<queue>
<name>queue-blue</name>
<target>v2.task-module</target>
</queue>
<queue>
<name>queue-red</name>
<rate>1/s</rate>
</queue>
</queue-entries>
在用于创建任务和指定辅助角色服务的文档中,它描述了为任务选择的目标,但没有明确描述如何指定它。
当任务从其队列中弹出时,任务队列服务会发送它 转到辅助角色服务。每个任务都有一个目标和一个 url,它们 确定哪个服务和处理程序最终将执行任务。
target
目标指定将接收 HTTP 请求的服务 执行任务。它是一个字符串,指定 服务/版本/实例采用任何一种规范形式。最 经常使用的有:
service version.service instance.version.service
目标字符串将附加到应用的域名前面。那里 是设置任务目标的三种方法:
- 显式声明在构造任务时的目标。
- 在队列.xml中定义队列时包括目标指令,如上面的 queue-blue 定义所示。添加到队列中的所有任务 使用目标将使用该目标,即使其他目标是 在施工时分配给任务。
- 如果未根据前两种方法中的任何一种指定目标,则任务的目标是 将其排队。请注意,如果从默认服务对任务进行排队 和以这种方式的版本,并且默认版本在 任务执行,它将在新的默认版本中运行。
url
url
选择目标服务中的一个处理程序,这将 执行任务。
url
应与目标中的处理程序 URL 模式之一匹配 服务。如果任务的方法为GET
或PULL
.如果未指定 url,则默认 URL 使用/_ah/queue/[QUEUE_NAME]
,其中[QUEUE_NAME]
是 任务的队列。
根据上述文档,如果您查看TaskOptions.Builder
,则没有指定任务目标的方法。这可能表示缺少有关如何指定目标的文档,或者只是在将任务添加到队列时无法再动态指定目标。根据前面的文档查看下面描述的方法。
基于早期文档的方法
免责声明:我在这里提到的内容似乎是基于过时的信息(我在下面引用了来源),因此可能无法按预期工作和/或将来中断。
您可以使用Host
标头指定将获取请求的模块、版本和实例信息。
要指定模块和版本,您可以执行以下操作:
Queue queue = QueueFactory.getQueue("QUEUE_NAME");
queue.add(TaskOptions.Builder
.withUrl("/url/path")
.param("key", "PARAM")
.header("Host",
ModulesServiceFactory.getModulesService().getVersionHostname("MODULE_NAME", "VERSION")));
要指定实例,您可以执行以下操作:
Queue queue = QueueFactory.getQueue("QUEUE_NAME");
queue.add(TaskOptions.Builder
.withUrl("/url/path")
.param("key", "PARAM")
.header("Host",
ModulesServiceFactory.getModulesService().getInstanceHostname("MODULE_NAME", "VERSION", "INSTANCE_NAME"));
我在当前版本的 App Engine 文档中找不到此信息,但使用 Wayback 机器,我从 2016 年 1 月 1 日的早期版本的文档中找到了此信息,该文档描述了推送任务的执行。在这个 github 问题中,它也在不同的上下文中进行了讨论。
推送任务执行
App Engine 通过向 .app。将编程异步回调指定为 HTTP 请求有时称为 Web 挂钩。Web 挂钩模型启用 高效的并行处理。
任务的 URL 确定任务的处理程序和模块 运行处理程序。
处理程序由 URL 的路径部分确定( 主机名后面的正斜杠分隔字符串),即 由包含在你对 Queue.add() 方法的调用。网址必须是相对的,并且 应用程序根目录的本地。
中的模块和版本 处理程序运行的由以下因素决定:
- "主机"标头参数 在对 Queue.add() 的调用中包含的任务选项中 方法。
- 队列.xml或队列 .yaml 文件中的目标指令。
如果未指定任何这些参数,则任务 将在排队的同一模块/版本中运行,主题 这些规则:
如果应用的默认版本对任务进行排队,则任务将运行 在默认版本上。请注意,如果应用对任务进行排队,并且 默认版本在任务实际运行之前更改,任务 将在新的默认版本中执行。
如果是非默认版本 对任务进行排队,该任务将始终在同一版本上运行。
注意: 如果将模块与调度文件一起使用,则任务的 URL 可能会 被截获并重新路由到另一个模块。
其中的命名空间 推送任务的运行是在将任务添加到队列时确定的。由 默认情况下,任务将在进程的当前命名空间中运行 创建了任务。您可以通过显式设置 将任务添加到队列之前的命名空间,如 多租户页面。