如何防止"冲突" firebase云功能?

时间:2017-09-26 12:58:18

标签: firebase google-cloud-functions

我有一组具有基于时间的派生属性的对象。

我有一个Firebase云功能正在侦听创建和写入以计算属性,并且它运行良好。

我还添加了一个通过HTTP触发的函数,比如cron,在周日早上重新计算属性(此属性将每周更改一次)。

这很好用,但每当cron函数更新一个属性时,第一个函数会捕获write并重新进行整个计算。

有一种简单的方法可以防止这种情况发生吗?我已经探索了为第一个函数设置一个环境变量来检测cron是否正在运行,但似乎环境变量似乎不能在运行时设置。

2 个答案:

答案 0 :(得分:2)

您应该可以通过检查以前的值来阻止这种情况。我试着提供一个例子

exports.yourFunction = functions.database.ref('/somepath/{someKey}').onWrite(event => {
  if (event.data.previous.val().time != event.data.val().time) {
    return;
  }
  else {
    // perform calculation
  }
 });

总之,如果前一个值与当前值不同,则变量time刚刚被其他函数更改。您需要将.time更改为您的变量名称。

注意:这不会阻止函数触发,它只会阻止它再次执行计算。如果你根本不想要发射这个功能,那么你必须设计一种不同的计算方法。例如只计算它onCreate然后在设定的时间间隔使用Cron来更新值。聆听onWrite将导致每次将数据写入Firebase时触发该功能。

您可以阅读有关Firebase Database Triggers

的更多信息

答案 1 :(得分:1)

警告::我的方法比较笨拙,可能需要重构代码,因此绝对不是您的解决方案。但是我认为您或未来的读者可能仍然会感兴趣。


我通过使用“命令”(应该做什么)和“事件”(已经发生的事情)来解决此问题。每个都有自己的集合,我的两个函数(CommandsHandlerEventsHandler)已订阅。

每个处理程序都会处理命令和事件,并且可能会或可能不会根据其所做的事情生成自己的事件和命令,这使我可以完全绕开您所描述的问题。

对于您来说,它的行为如下:

更新

命令Update item 'Item' with 'blablabla'->事件Item 'Item' updated->命令Calculate property 'Property' for item 'Item'->事件Property 'Property' updated in item 'Item'

Cron

定时功能触发器->命令Calculate property 'Property' for item 'Item'->事件Property 'Property' updated in item 'Item'