【问题标题】:How to prevent sending multiple requests to Firestore from React-Native app?如何防止从 React-Native 应用程序向 Firestore 发送多个请求?
【发布时间】:2020-01-25 13:18:09
【问题描述】:

我有一个将被许多用户使用的应用程序,有时他们会同时发布到同一个文档,Firebase 将如何处理这个问题。有什么办法可以防止这种情况发生吗?

我的场景是这样的:有一家餐厅可以点餐,但数量有限,假设有 5 个,并且有 10 个用户同时发布到该文档,我该如何防止这种情况发生?附言我在 RN 应用程序中使用侦听器,因此它一直检查数量的变化,但如果用户比应用程序中的更新更快怎么办?

【问题讨论】:

    标签: firebase react-native google-cloud-firestore


    【解决方案1】:

    为了控制多个并发写入,您应该使用事务来确保每个客户端不会覆盖其他客户端正在执行的操作。该事务将确保一次只有一个客户端可以写入文档。在您的交易中,您可以检查某些文档字段是否处于不应超过的限制,如果超过则使交易失败。

    阅读documentation on transactions 以更好地了解其工作原理。`

    【讨论】:

    • 非常感谢您的建议,我现在刚刚实现了一个批处理操作。我必须一次写 3 个文件,所以这样我做得很好。
    • 你能再解释一下吗,因为我不明白:“在你的交易中,你可以检查某些文档字段是否处于不应超过的限制,如果是,则使交易失败超过”
    • 在您的事务处理程序中,您可以检查文档的内容以确定用户想要执行的写入操作是否有效(您的所有限制都可以)。如果它无效,那么您可以简单地不执行写入,并使事务失败。如果交易失败,您可以编写更多代码来检测它并向用户提供一些关于出错的信息。
    • 啊,例如“食品折扣”的数量有限。因为该数字正在从数据库中不断更新,我正在监听它的更改,并基于此进行验证,但是如果该数字在另一个用户提交的确切时刻变为 0 怎么办?所以在这种情况下我可以用你说的对吗?
    • 因为,正如您所说,多个客户端可能同时写入集合,您不能相信最近一次读取和下一次写入之间没有任何变化。
    【解决方案2】:

    您可以使用以下概念:“接受或拒绝查询”

    您的安全规则还可以根据其约束接受或拒绝查询。 request.query 变量包含查询的限制、偏移和 orderBy 属性。例如,您的安全规则可以拒绝任何不将检索到的最大文档数限制在特定范围内的查询:

    allow list: if request.query.limit <= 5;
    

    此外,您应该考虑使用cloud functions,而不是直接从客户端更新值。 更清楚地说,您可以通过 HTTP 请求调用函数。

    【讨论】:

    • 不幸的是,安全规则并不能真正帮助防止来自不同客户端的多个并发写入,并且request.query.limit 根本没有解决所述问题。
    • 感谢您的回答。我对这个 Cloud 函数有点困惑,它听起来和客户端应用程序中的 onSnapshot 监听器一样。它不是在做同样的事情吗?
    • @bmm 不要在这里为 Cloud Functions 烦恼。这不是必需的。正如我在回答中描述的那样,在客户端使用事务。
    • @bmm 更清楚地说,您可以通过 HTTP 请求调用函数:firebase.google.com/docs/functions/http-events
    • @OronBen-David 为什么我应该使用函数而不是事务和批处理?
    猜你喜欢
    • 2023-03-09
    • 2021-07-28
    • 2016-11-27
    • 2021-03-22
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多