Google Cloud Tasks HTTP 触发器 - 如何禁用重试

Posted

技术标签:

【中文标题】Google Cloud Tasks HTTP 触发器 - 如何禁用重试【英文标题】:Google Cloud Tasks HTTP trigger - how to disable retry 【发布时间】:2020-01-26 18:36:00 【问题描述】:

我正在尝试创建一个在 HTTP 任务失败时从不重试的 Cloud Tasks 队列。

根据documentation,maxAttempts 应该是我要找的:

每个任务的尝试次数。

Cloud Tasks 将尝试任务 maxAttempts 次(也就是说,如果 第一次尝试失败,然后将有 maxAttempts - 1 次重试)。必须 是 >= -1。

因此,如果 maxAttempts 为 1,则应该有 0 次重试。

但是,例如,如果我运行

gcloud tasks queues create test-queue --max-attempts=1 --log-sampling-ratio=1.0

然后使用以下 Python 代码创建 HTTP 任务:

from google.cloud import tasks_v2beta3
from google.protobuf import timestamp_pb2
client = tasks_v2beta3.CloudTasksClient()
project = 'project_id' # replace by real project ID
queue = 'test-queue'
location = 'us-central1'
url = 'https://example.com/task_handler' # replace by some endpoint that return 5xx status code
parent = client.queue_path(project, location, queue)
task = 
        'http_request':   # Specify the type of request.
            'http_method': 'POST',
            'url': url  # The full url path that the task will be sent to.
        

response = client.create_task(parent, task)
print('Created task '.format(response.name))

在队列的 Stackdriver 日志中(我可以看到,因为我在创建队列时使用了 --log-sampling-ratio=1.0),任务显然重试了一次:有一次调度尝试,然后是状态为 UNAVAILABLE 的调度响应,然后由另一个调度尝试,最后是最后一个调度响应(也表示不可用)。

有没有办法重试0次?

注意

关于 maxAttempts,文档还说:

该字段与queue.yaml/xml中的task_retry_limit含义相同。

但是,当我转到description for task_retry_limit 时,它说:

重试次数。例如,如果指定了 0 并且任务 失败,任务根本不会重试。如果指定 1 并且任务 失败,任务重试一次。如果未指定此参数,则 任务无限期重试。如果 task_retry_limit 指定为 task_age_limit,重试任务,直到达到两个限制。

这似乎与maxAttempts的描述不一致,因为它表明如果参数为1,任务将重试一次。

我尝试将 maxAttempts 设置为 0,但这似乎使它假定默认值为 100。

提前谢谢你。

【问题讨论】:

我添加了一个错误来清除 max_attempts 和 task_retry_limit 之间的区别。不过我很好奇,你知道你的处理程序返回什么响应代码吗? @AveriKitsch - 谢谢。我已经用一个总是返回响应代码 500 的虚拟处理程序进行了测试。但我首先注意到它发生在一个“真实”处理程序上,该处理程序有一个临时错误并在第一次调度中返回 500,然后该任务随后重试了 1 次并成功(即返回 200)。 我很抱歉响应缓慢。这是一个错误。目前我无法估计修复程序何时发布。 @AveriKitsch 没问题,谢谢您的回复。 【参考方案1】:

正如@averi-kitsch 所提到的,这是我们的 Cloud Tasks 工程师团队目前正在处理的内部问题,遗憾的是我们还没有任何 ETA。

您可以通过Public Issue Tracker关注本期的进展,点击“星号”订阅并接收未来更新。

作为一种解决方法,如果您不希望任务在失败后重试,请直接在 queue.yaml 上设置“task_retry_limit=0”。

示例:

queue:
- name: my-queue1
 rate: 1/s
 retry_parameters:
   task_retry_limit: 0

【讨论】:

谢谢 - 所以这意味着,如果我不想重试,我现在应该切换到使用 queue.yaml 文件来管理队列,而不是通过诸如“ gcloud 任务队列创建”。 没错。密切关注问题跟踪器,以了解“gcloud tasks queues create”命令的问题何时修复并生效。

以上是关于Google Cloud Tasks HTTP 触发器 - 如何禁用重试的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Tasks HTTP 触发器 - 如何禁用重试

每个任务都无法在 Google Cloud Tasks 上执行

使用 HttpRequest 作为 payload_type 时,Google Cloud Tasks 始终将 HttpMethod 设置为 GET

Google Cloud Tasks ImportError:无法导入名称“resource_pb2”

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

Google Cloud Tasks 和 Google App Engine Python 3