我创建了一个云任务,该任务的重试策略设置为最大尝试次数(例如 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
状态错误,但我认为当您最终忘记该规则时,这可能会在将来产生意想不到的结果。此外,它没有考虑发生其他事情并且任务从未执行的时间。