【问题标题】:Strong consistency with Firebase real-time database与 Firebase 实时数据库的强一致性
【发布时间】:2019-08-02 03:23:20
【问题描述】:

Firebase 实时数据库是否提供强一致性

在某些情况下,我们将 Firebase 实时数据库用作队列:

场景 1

  1. 移动客户端item文档写入/items
  2. Server A(云功能)监听/items,并通过POST /processItem/:itemID调用Server B
  3. 服务器 B 获取 items/:item 并开始处理
  4. 处理后,服务器 B 写入 item.processedAt = <timestamp>

场景 1 的逻辑似乎工作正常,但是,我们开始怀疑 Firebase 是否真的提供强一致性,以及我们是否可以确定 Server B 何时获取 items/:itemID来自 Firebase,文档肯定存在。

场景 2

  1. 服务器 Aitem 文档写入 /items 并等待 .set() 操作通过。
  2. 服务器 A 通过 POST /processItem/:itemID 调用 服务器 B
  3. 服务器 B 获取 items/:itemID 并开始处理
  4. 处理后,服务器 B 写入 item.processedAt = <timestamp>

这可能会更加“危险”,因为 服务器 A 可能会在 child_added 事件触发之前调用 服务器 B

这两种情况都安全吗?

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    恕我直言,这两种情况都是安全的。

    场景 1 是完全安全的。因为只有在firebase完全写入数据时才会调用云函数。所以,在场景 1 中你绝对是安全的。

    对于场景 2。你可以这样走。

    • 服务器 A 将 item 文档写入 /items
    • 服务器 A waits for the callback 从 firebase 完成。
    • 服务器 A 通过POST /processItem/:itemID 调用服务器 B
    • 服务器 B 获取 items/:itemID 并开始处理
    • 处理后,服务器 B 写入 item.processedAt = <timestamp>

    【讨论】:

    • 很好地澄清场景 2 - 这正是我的意思。你的“拙见”是基于什么? :) 为什么我要问是因为假设 Firebase 将数据托管在分布式系统上,因此在一个实例上成功写入可能不一定保证它已经与所有其他实例同步。 IE。写入完成处理程序是否意味着写入已经跨实例完成 - 或仅在一个实例上完成?
    • 我认为,写入完成处理程序在写入一个实例后立即调用,然后写入其他实例。
    • 这将使服务器 B 有可能从尚未同步的实例中获取数据。没有?
    • 我不这么认为。因为,实时数据库足够快,甚至在执行写完成回调之前,所有数据都可以在所有实例上复制。无论如何,最好的办法是通过设置演示项目来尝试一下。
    • 是的,在大多数情况下这可能是正确的,但它是由设计保证的吗?建立一个演示项目并不能证明这不可能发生。
    【解决方案2】:

    Bhavin Panara 是正确的。按照您所描述的方式,这两种情况都是“安全的”。确认写入后,实时数据库保证任何后续读取都将看到确认写入的结果。写入触发的云函数也是如此。

    正如您所指出的,侦听器是异步更新的,因此侦听位置的客户端可能在一段时间内不会更新有关写入的信息。

    请注意,即使使用高度一致的数据库,仍然可能存在竞争条件。考虑以下场景:

    场景 3

    • 移动客户端在/items/item1创建数据
    • 服务器 A(云功能)监听 /items 并通过 POST /processItem/:itemID 调用服务器 B
    • 移动客户端删除/items/item1处的数据
    • 服务器 B 收到服务器 A 的请求并获取 /items/item1,但该项目已被删除。

    在这些情况下,使用transactions 可能会有所帮助。

    【讨论】:

    • 你能参考任何提到这一点的文档吗? “RTDB 保证任何后续读取都会看到结果”与 Bhavin 的观点相矛盾,即“对于 RTDB,它不是通过设计来保证的”。
    猜你喜欢
    • 2020-03-31
    • 2015-06-05
    • 2019-08-07
    • 2019-09-06
    • 1970-01-01
    • 2021-09-03
    • 2018-04-15
    • 2015-09-15
    相关资源
    最近更新 更多