google-cloud-platform - Cloud Tasks + Cloud Functions - 重复执行
问题描述
我正在同时使用 Google Cloud Tasks 和 Cloud Functions 来并行执行许多任务。
- Cloud Function 使用 HTTP 触发器进行部署。
- 我正在一个队列中创建多个 HTTP 目标任务,以便为多个不同的输入调用相同的云函数。
- Cloud Function 完成的任务涉及调用 HTTP API,这些 API 有时会失败并需要重试。因此,任务队列有
maxAttempts
= 10。 - 这个过程每天运行一次,它会在 30 分钟左右的时间内生成大约 11,000 个任务。
它似乎在大多数情况下运行良好,但我见过几次意外行为:有时,Cloud Tasks 认为该函数失败并重试它,即使该函数尚未完成运行,最终成功. 发生这种情况时,我会在队列的日志中看到这一点(队列是使用 创建的--log-sampling-ratio=1.0
):
- Cloud Tasks 创建一个任务。
- 已尝试调度 1。
- 云函数执行 1 开始。
- 云函数执行 1 崩溃。队列的日志显示尝试 1 以“UNAVAILABLE”状态失败,并且按预期尝试分派 2。
- 云函数执行 2 开始。
- 即使执行 2 尚未完成,队列的日志显示调度尝试 2 以“不可用”状态失败,然后尝试调度 3。
- Cloud Function 执行 3 开始。
- Cloud Function 执行 3 以状态 200 结束。
- Cloud Function 执行 2 以状态 200 结束。
所以云函数最终成功执行了 2 次。
如文档中所述,我知道 Cloud Tasks 不能保证始终严格执行一次。但是,我仍然想确认是否会出现这种特殊情况以及是否有任何方法可以防止这种情况发生。
解决方案
在您的任务中定义:
tasksClient.createTask({ parent: queuePath, task, resource: { retryConfig: { maxAttempts: 1 } } })
我在这里找到它:文档