有没有办法避免使用 Firebase 触发器(其中触发器更新其自己的节点)进行双重调用?

问题描述 投票:0回答:1

我有一个回合制游戏,我想验证和处理每个玩家发送的数据,然后使用 firebase 触发器更新状态。目前使用RTDB。澄清一下,该节点如下所示:

  • 游戏ID
    • 状态
      • userTurn:字符串?
      • 状态变量
        • var1
        • var2 等

所以,我目前在 gameId/state 上有一个触发器。如果 userTurn 不为 null,则将 userTurn 与当前的 stateVariables 一起传递给创建新游戏状态的函数,然后更新状态变量,删除 userTurn。

当触发器删除 userTurn(并更新 stateVariables)时,触发器将再次触发。但由于 userTurn 为 null,我将返回 null,然后我们等待下一个玩家的回合。

我为什么要这样做?因为速度很重要,所以我想尽可能快地处理数据。有计时器,为了用户体验,转弯必须尽可能快。

问题很明显:每一次移动,触发器都会有2次调用和2次读取,这会增加我的成本。

我考虑过简单地将触发器放在 gameId/state/userTurn 上并读取 gameId/state/stateVariables -> 再次更新状态。但这会增加回合之间的时间并增加所有玩家的感知延迟。我当前解决方案的优点是触发器在触发时可以立即访问 stateVariables 中的数据。

所以我的问题是:有没有办法避免双重调用?或者更好的方法?

感谢任何帮助和想法!

database firebase firebase-realtime-database google-cloud-functions
1个回答
0
投票

在不改变数据模型的情况下,没有办法阻止这种双重调用。您必须在第二次检测并中止该函数。

如果您愿意更改数据模型,常见的解决方案是拥有两个单独的队列(此处可能基于

userTurn
值)并将任务从一个队列移动到另一个队列。

© www.soinside.com 2019 - 2024. All rights reserved.