如何防止云调度器多次触发一个函数?

Posted

技术标签:

【中文标题】如何防止云调度器多次触发一个函数?【英文标题】:How to prevent cloud scheduler from triggering a function more than once? 【发布时间】:2020-03-17 21:41:48 【问题描述】:

我每分钟都会使用云调度程序 [* * * * *] 触发一个云功能。

Stackdriver 日志表明该函数似乎已被触发并在同一分钟内运行了两次。这可能吗?

PubSub 承诺至少一次交付,但我认为 GCP 会自动处理调度程序 -> 函数工作流的重复触发器。

防止此功能每分钟运行一次以上的好模式是什么?

【问题讨论】:

【参考方案1】:

您的函数必须是made "idempotent",以确保消息只被处理一次。换句话说,您必须在某处(可能是数据库)维护消息已成功处理的状态,并检查该状态以确保消息不会被处理两次。

所有非 HTTP 类型的云函数在提供给函数调用的 context parameter 中提供唯一的事件 ID。如果您看到重复的事件 ID,则意味着您的函数正在为同一条消息再次调用,无论出于何种原因。

这种对幂等性的需求并不是 pubsub 或云调度程序所独有的。这是所有非 HTTP 类型的后台函数都需要考虑的问题。

关于编写幂等函数的完整讨论有点过于堆栈溢出答案,但有一个 post in the Google Cloud blog 很好地涵盖了这个问题。

另请参阅:Cloud functions and Firebase Firestore with Idempotency

【讨论】:

谢谢道格!你是说如果我使用云调度器通过 HTTP 触发一个函数,那么我可以保证只执行一次? 不,每个事件都可能多次调用任何后台函数(尽管应该很少见)。对于通过异步接口解耦的系统来说,这是一个不幸的现实,同时允许在该接口的任一侧发生可能导致数据丢失的错误。在计算机科学中,它被称为两位将军问题。 en.wikipedia.org/wiki/Two_Generals%27_Problem

以上是关于如何防止云调度器多次触发一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql存储过程触发器事件调度器使用入门

如何设计分布式作业调度器? [关闭]

调度器调频学习笔记

吾家Swan初长成|数人云Mesos开源调度器

由 Windows 任务调度程序触发

云原生 | kubernetes- 资源调度