云功能幂等问题

时间:2019-03-05 15:29:51

标签: firebase google-cloud-functions

我已经实现了context.eventId,但是现在遇到了以下问题。显然,我不希望以相同的顺序触发呼叫,甚至每个动作甚至不会触发一次,但是,同一事件相隔3次10秒发生似乎很糟糕。

  1. 17:07:33
  2. 第二次触发时间 17:07:43 10秒之后)
  3. 17:07:54 (在 11秒之后)的第三次触发

在同一事件之间触发了3次(相隔10秒)的其他事务也发生了,因此,当它第一次触发时,它保存了eventId然后丢失了它,因为发生了另一个事件。然后,在10秒后再次触发了同一事件,由于先前的事务已经覆盖了lastEventId(在那10秒的间隔内发生),因此显然没有将其标记为重复。

这怎么可能?我们如何解决这个问题?处理它们只需要150毫秒左右的时间,因此它不是一个大功能文件,在冷启动过程中需要大量时间。它缓存了全局变量(firestore),它对我在某些函数上使用的变量进行了延迟加载。总体来说,这是一个简单的功能文件。同一文件中只有250行代码和9个函数。

enter image description here

1 个答案:

答案 0 :(得分:1)

云函数为后台函数的执行提供了至少一次保证。这意味着一个函数可能对每个事件执行多次。尽管并不常见,但这只是可伸缩系统处理多台机器必须异步协调和通信的潜在错误的方式。

如果对于事件重复事件的函数调用对您的函数而言是有问题的,则您需要以使函数幂等的方式对函数进行编码。您可以watch this video了解更多信息,并阅读documentation

无法避免的总体问题是在计算机科学中称为Two Generals problem。您可以阅读有关内容,以更好地理解更大的问题。基本上,所有运行Cloud Functions的计算机系统都不能始终可靠地进行100%相互通信(由于错误和数据丢失),因此重试对于确保功能至少执行一次至关重要,这更好从来没有。