Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 分布式计数器中是否确实需要事务?_Firebase_Transactions_Google Cloud Firestore_Counter - Fatal编程技术网

Firebase 分布式计数器中是否确实需要事务?

Firebase 分布式计数器中是否确实需要事务?,firebase,transactions,google-cloud-firestore,counter,Firebase,Transactions,Google Cloud Firestore,Counter,据firestore称: 事务是对一个或多个文档的一组读写操作 此外: 当客户端脱机时,事务将失败 现在firestore的限制是: 在CloudFireStore中,您只能每秒更新一次单个文档,这对于某些高流量应用程序来说可能太低了 因此,当流量较高时,使用云函数和运行事务来增加/减少计数器将失败 因此,他们讨论了使用的方法 根据分布式计数器的算法: 创建碎片 随机选择一个碎片 运行事务以递增/递减计数器 获取所有碎片并聚合 显示计数器值的结果 场景: 假设您有一个计数器,当添加文档并在U

据firestore称:

事务是对一个或多个文档的一组读写操作

此外:

当客户端脱机时,事务将失败

现在firestore的限制是:

在CloudFireStore中,您只能每秒更新一次单个文档,这对于某些高流量应用程序来说可能太低了

因此,当流量较高时,使用云函数和运行事务来增加/减少计数器将失败

因此,他们讨论了使用的方法

根据分布式计数器的算法:

  • 创建碎片
  • 随机选择一个碎片
  • 运行事务以递增/递减计数器
  • 获取所有碎片并聚合 显示计数器值的结果
场景:
假设您有一个计数器,当添加文档并在UI中显示计数器时,该计数器将被更新。现在,对于良好的用户体验,我不能在网络离线时阻止用户界面。因此,我必须允许创建/更新文档,即使客户端处于脱机状态,并在客户端处于联机状态时同步这些更改,以便所有其他侦听这些更改的人都能收到正确的计数器值

现在,当客户端脱机时,事务失败。 因此,要获得最佳用户体验(即使在离线状态下),我的问题是:

  • 您真的需要交易来增加计数器吗?我知道 事务确保写入是原子的,并且 成功/不成功并阻止部分写入。但问题是什么 当他们离线失败的时候?我在想,一旦网络恢复在线,可能会将它们写入本地缓存并同步

  • 这应该通过云计算功能的客户端SDK完成吗

  • 您真的需要一个事务来增加计数器吗

    当然可以!因为我们正在创建可以在多用户环境中使用的应用程序,所以事务是必需的,所以我们可以提供一致的数据

    但当他们离线失败时,又有什么意义呢

    当网络连接丢失(用户设备上没有网络连接)时,事务不支持脱机使用。这是因为事务绝对需要与服务器进行往返通信,以确保事务中的代码成功完成。因此,事务只能在联机时执行

    这应该通过云计算功能的客户端SDK完成吗

    请注意,Firestore SDK for Android具有默认启用的。根据官方文件,关于:

    对于Android和iOS,默认情况下启用脱机持久性。要禁用持久性,请将PersistenceEnabled选项设置为false

    因此,如果服务器上没有更新,所有读取操作都将来自缓存。因此Firestore为处理脱机数据提供了此功能

    您还可以在Cloud函数中编写一个函数,该函数将在添加新文档时递增计数器,或在删除文档时递减计数器

    我还建议您看看:

    <>你也可以考虑使用FielBaseRealTimeDeabor数据库。Cloud Firestore和Firebase实时数据库配合得非常好

    编辑:

    即使在设备离线的情况下,它也允许用户向上投票。网络联机后,它将同步到服务器并更新计数器。当设备脱机时,我是否可以在firestore中执行此操作

    默认情况下也会发生这种情况。因此,如果用户尝试在脱机时添加/删除文档,则每个操作都会添加到队列中。一旦用户恢复连接,脱机时所做的每项更改都将在Firebase服务器上更新。换句话说,所有查询都将在服务器上提交

    只有在收到更改时才会触发云操作,并且只有在设备联机时才会触发云操作

    是的,没错。一旦设备恢复网络连接,文档将从数据库中添加/删除,此时函数将启动并增加/减少计数器

    Edit2:

    假设我离线进行了大约100次操作,当设备上线时,这不会给云功能带来负担吗?你对此有什么想法

    脱机时,尚未同步到服务器的挂起写入将保留在队列中。如果您在没有联机同步的情况下执行了太多的写入操作,那么该队列将快速增长,不仅会减慢写入操作,还会减慢读取操作。所以我建议使用这个数据库来实现它的在线功能


    关于这100个离线操作的云功能,不会有任何问题。Firebase服务器可以很好地处理并发操作。

    好的,总而言之,您建议在实时数据库而不是firestore上托管计数器,还建议使用云fns来增加/减少实时数据库中的计数器。我对这一点的理解是否正确?是的,它是正确的。我建议您在Firebase实时数据库中托管计数器,因为它比云Firestore中的计数器便宜。是的,您可以编写一个与用户设备无关的函数。一切都在服务器端完成。问题是如何在设备脱机时提供良好的用户体验。例如,让我们以堆栈溢出为例。即使在设备离线的情况下,它也允许用户向上投票。网络联机后,它将同步到服务器并更新计数器。当设备脱机时,我是否可以在firestore中执行此操作。。只有在收到更改时才会触发云操作,并且只有在设备联机时才会触发云操作