从任务中检查 Google Cloud 任务队列重试参数



我创建了一个云任务,该任务的重试策略设置为最大尝试次数(例如 4)。

但是,我们希望任务在任务最后一次失败时回退到默认解决方案。

也就是说,如果任务在第一次失败,我们只需记录错误并返回500.又是第二次。第三个。等。。。但是,如果当前TaskRetryCount是该队列的最后一次尝试(即本例中的 4),那么我们将在最后一次返回500之前执行一些回退行为。

我可以从云任务 HTTP 处理程序文档中看到,我可以从请求的标头中获取X-CloudTasks-TaskRetryCount。但它似乎没有办法获得队列的max-attempts

这是我能抓住的东西吗?

还是我的做法是错误的?有没有更好的方法来做我想做的事情。

假设任务是使用云任务创建的,则队列级别的重试设置将应用于队列中使用云任务创建的所有任务(因为它们不能在单个任务上设置)。从 REST API 调用 projects.locations.queues.get 方法应从队列返回 RetryConfig 设置,其中包含所需的maxAttempts字段。

对于使用 App Engine SDK 创建的任务,您应该参考此文档(尽管我认为该方法已弃用,对您的用例没有用)。

您可以使用getQueue调用和检查queue.retryConfig.maxTrys检索队列最大尝试次数值,并使用标头X-CloudTasks-TaskRetryCount检查当前重试,如果maxTry != -1 && maxTry == (retry+1)您在上次重试中

。请注意,X-CloudTasks-TaskRetryCount仅计算返回 5xx 状态代码的任务,以及未进入执行阶段(代码)的任务。 如果只想计算执行阶段发生的失败尝试,则应使用标头X-CloudTasks-TaskExecutionCount并确保您的代码返回 4xx 状态代码,以防出现错误。 根据文档:

X-CloudTasks-TaskExecutionCount任务从处理程序接收响应的总次数。由于云任务 收到成功响应后删除任务,全部 以前的处理程序响应失败。此数字不包括 由于 5XX 错误代码导致的故障。

如果要在最后一次重试时执行某些操作,可以使用以下代码。

它使用 @google-cloud/tasks 从队列中获取maxAttempts,然后将其与任务标头中找到的taskRetryCount进行比较。

import { CloudTasksClient } from '@google-cloud/tasks';
// Get the task queue
const tasksClient = new CloudTasksClient();
const request = {
name: `projects/${PROJECT_ID}/locations/${LOCATION}/queues/${TASK_QUEUE_NAME}`,
};
const taskQueue = await tasksClient.getQueue(request);
// Get maxAttempts
const maxAttempts = Number(taskQueue[0].retryConfig?.maxAttempts);
// Get taskRetryCount
const taskRetryCount = Number(req.headers['x-cloudtasks-taskretrycount']);
// We need to use "taskRetryCount + 1" to trigger something on the last retry
// We need to check for "maxAttempts != -1" because -1 is unlimited attempts
if (maxAttempts != -1 && taskRetryCount + 1 == maxAttempts) {
// Do something here on the last retry
}

注意1:我必须使用小写标题才能工作。 即x-cloudtasks-taskretrycount而不是谷歌文档中的X-CloudTasks-TaskRetryCount

注2:在@Avishay28的回答中,建议使用x-cloudtasks-taskexecutioncount而不是x-cloudtasks-taskretrycount,但我相信,如果您在最后一次重试中尝试执行某些操作,则应使用x-cloudtasks-taskretrycount

以下是从文档中获取的描述:

  • X-CloudTasks-TaskRetryCount:此任务重试的次数。对于第一次尝试,此值为 0。此数字包括由于 5XX 错误代码而导致任务失败且从未达到执行阶段的尝试。
  • X-CloudTasks-TaskExecutionCount:任务从处理程序收到响应的总次数。由于云任务会在收到成功响应后删除任务,因此所有以前的处理程序响应都是失败的。此数字不包括由于 5XX 错误代码导致的故障。

因此,如果您的任务返回5xx代码或发生了某些事情并且任务从未执行过,那么taskretrycount将高于taskexecutioncount。由于任务将在taskretrycount超过maxAttempts时结束,因此可能会有一个位置,即任务将在您执行上一个任务之前结束。

另一种选择是使用taskexecutioncount并且永远不会从您的任务返回5xx状态错误,但我认为当您最终忘记该规则时,这可能会在将来产生意想不到的结果。此外,它没有考虑发生其他事情并且任务从未执行的时间。

相关内容

  • 没有找到相关文章

最新更新