如何防止云调度程序多次触发功能?
How to prevent cloud scheduler from triggering a function more than once?
我使用云调度程序每分钟触发一个云函数 [* * * * *]
。
Stackdriver 日志表明该函数似乎已被触发,并且 运行 在同一分钟内触发了两次。这可能吗?
PubSub 承诺 至少一次 交付,但我假设 GCP 会自动处理调度程序 -> 函数工作流的重复触发器。
什么是防止此函数每分钟 运行 宁多次的好模式?
您的函数需要 made "idempotent" 以确保消息只被处理一次。换句话说,您必须在某处(可能是数据库)维护消息已成功处理的状态,并检查该状态以确保消息不会被处理两次。
所有非 HTTP 类型的 Cloud Functions 在提供给函数调用的 context parameter 中提供唯一的事件 ID。如果您看到重复的事件 ID,这意味着无论出于何种原因,您的函数都会再次针对同一消息被调用。
这种对幂等性的需求并不是 pubsub 或云调度程序所独有的。这是所有非 HTTP 类型后台函数的一个问题。
关于编写幂等函数的完整讨论有点过于 Stack Overflow 的回答,但是 post in the Google Cloud blog 很好地涵盖了这个问题。
另请参阅:
我使用云调度程序每分钟触发一个云函数 [* * * * *]
。
Stackdriver 日志表明该函数似乎已被触发,并且 运行 在同一分钟内触发了两次。这可能吗?
PubSub 承诺 至少一次 交付,但我假设 GCP 会自动处理调度程序 -> 函数工作流的重复触发器。
什么是防止此函数每分钟 运行 宁多次的好模式?
您的函数需要 made "idempotent" 以确保消息只被处理一次。换句话说,您必须在某处(可能是数据库)维护消息已成功处理的状态,并检查该状态以确保消息不会被处理两次。
所有非 HTTP 类型的 Cloud Functions 在提供给函数调用的 context parameter 中提供唯一的事件 ID。如果您看到重复的事件 ID,这意味着无论出于何种原因,您的函数都会再次针对同一消息被调用。
这种对幂等性的需求并不是 pubsub 或云调度程序所独有的。这是所有非 HTTP 类型后台函数的一个问题。
关于编写幂等函数的完整讨论有点过于 Stack Overflow 的回答,但是 post in the Google Cloud blog 很好地涵盖了这个问题。
另请参阅: