Cloud Tasks + Cloud Functions - 重复执行

Posted

技术标签:

【中文标题】Cloud Tasks + Cloud Functions - 重复执行【英文标题】:Cloud Tasks + Cloud Functions - duplicate executions 【发布时间】:2020-05-11 16:03:06 【问题描述】:

我正在同时使用 Google Cloud Tasks 和 Cloud Functions 来并行执行许多任务。

使用 HTTP 触发器部署 Cloud Function。 我正在一个队列中创建多个 HTTP 目标任务,以便为多个不同的输入调用同一个云函数。 Cloud Function 完成的任务涉及调用 HTTP API,这些 API 有时会失败并需要重试。因此,任务队列有maxAttempts = 10。 此流程每天运行一次,在 30 分钟左右的时间内生成约 11000 个任务。

它似乎在大多数情况下运行良好,但我曾多次看到意外行为发生:有时,Cloud Tasks 认为该函数失败并重试它,即使该函数尚未完成运行,并最终成功。发生这种情况时,我会在队列的日志中看到这一点(队列是使用 --log-sampling-ratio=1.0 创建的):

Cloud Tasks 创建一个任务。 已尝试调度 1。 云函数执行 1 开始。 云函数执行 1 崩溃。队列的日志显示尝试 1 以“UNAVAILABLE”状态失败,并且按预期尝试调度 2。 云函数执行 2 开始。 尽管执行 2 尚未完成,但队列的日志显示分派尝试 2 以“不可用”状态失败,然后尝试分派 3。 云函数执行 3 开始。 云函数执行 3 以状态 200 结束。 云函数执行 2 以状态 200 结束。

所以云函数最终成功执行了 2 次。

我知道 Cloud Tasks 不能保证始终严格执行一次,如文档中所述。但是,我仍然想确认是否会出现这种特殊情况以及是否有任何方法可以防止这种情况发生。

【问题讨论】:

正如您已经提到的,这可能是一些罕见的duplicate executions。您的函数代码和异步调用处理也可能存在问题。即使在函数返回结果之后,异步调用也会继续执行并记录,直到运行时被终止。这似乎不像您发布的日志流中的情况,但仍然值得检查how your function signals completion 【参考方案1】:

在你的任务中定义:

tasksClient.createTask( parent: queuePath, task, resource:  retryConfig:  maxAttempts: 1   )

我在这里找到它:doc

【讨论】:

以上是关于Cloud Tasks + Cloud Functions - 重复执行的主要内容,如果未能解决你的问题,请参考以下文章

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

从 Cloud Tasks 触发 HTTP Cloud Function 时出现 PERMISSION_DENIED 403 错误

Cloud Tasks 条件执行

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

Google Cloud Tasks 未分派 HTTP 请求

如何以安全的方式从 Cloud Tasks 调用 Firebase 函数?