Cloud Tasks 客户端忽略重试配置

Cloud Tasks client ignores retry configuration

基本上就是标题所说的。 API 和客户端文档声明可以将重试传递给 create_task:

        retry (Optional[google.api_core.retry.Retry]):  A retry object used
            to retry requests. If ``None`` is specified, requests will
            be retried using a default configuration.

但这根本行不通。传递 Retry 实例不执行任何操作,仍然使用 queue-level 设置。例如:

from google.api_core.retry import Retry
from google.cloud.tasks_v2 import CloudTasksClient

client = CloudTasksClient()
retry = Retry(predicate=lambda _: False)
client.create_task('/foo', retry=retry)

这应该创建一个不重试的任务。我尝试了各种不同的配置,每次它只使用 queue.

上设置的任何设置

您可以传递自定义谓词以重试不同的异常。没有正式的迹象表明此参数会阻止重试。您可以查看重试 page 了解详情。

Google 云支持已确认 当前不支持任务级重试。 此客户端库的文档不正确。此处存在功能请求 https://issuetracker.google.com/issues/141314105

任务级重试参数在 Google App Engine 任务队列捆绑服务 Task Queues 中可用。如果您的应用程序在 GAE 上,我猜这是因为您的问题被标记为 google-app-engine,您可以从 Cloud Tasks 切换到 GAE Task Queues。

当然,如果您的应用程序依赖于 Cloud Tasks 独有的东西,例如 beta HTTP 端点,则捆绑服务将无法工作(参见 new features 的列表,不用担心"List Queues command" 因为您总是可以在捆绑服务中使用的配置中看到它)。除此之外,在切换到任务队列之前需要考虑以下事项。

注意事项

  • 供应商偏好 - Google 似乎更喜欢 Cloud Tasks。来自 push queues migration guide 介绍:"Cloud Tasks is now the preferred way of working with App Engine push queues"
  • 锁定 - 即使您的应用程序在 GAE 上,将您的队列解决方案移动到 GAE 捆绑的解决方案也会增加您的 "lock in" 到 GAE 托管(即它使如果你想改变你的应用程序的位置,你就更难离开 GAE,因为你将失去你的任务队列解决方案,除了处理新主机之外还必须处理它)
  • Queues by retry - GAE Task Queues to Cloud Tasks 迁移指南部分 Retrying failed tasks 建议为每组重试参数创建一个专用队列,然后将任务排队因此。这可能是继续使用 Cloud Tasks 的合适方式