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