我在Firebase下有一个针对不同餐厅的节点,其中包含活动和过去访问者的列表。此节点名为listvisitors
。在餐厅节点下,我想为所有访客提供一个柜台。这是我想要使用Firebase交易的地方。
当一个人打开餐厅页面时,想法是增加计数器。由于存在争用,交易似乎是一个不错的选择。
一家受欢迎的餐厅可以同时访问大量访客,从而导致争用。事务可以扩展来处理这个吗?
如果是这样,在失败时出现最大重试错误,事务可以处理的最大重试次数是多少。 (基本上是假设所有用户同时登录的最大同时更新)
如果没有。是否有一种有效的替代方案可以基本上计算列表下当前子项的数量并获得正确的数字?
答案 0 :(得分:1)
如果在25次尝试后没有成功,Firebase客户端当前会中止该事务。
在你看到这种竞争程度之前,改变一种不同的策略是明智的。解决此问题的常见方法是不让每个访问者更新公共计数器,而是让每个访问者使用push()
将“我访问过此”写入数据库:
ref.child("visits").push().setValue(currentUser.getUid());
然后,您可以拥有一个服务器端进程,将访问从列表中拉出来并使计数器递增。处于稳定状态,表示visits
列表为空。在任何时候,visits
列表只包含尚未计算的访问次数。
这将表现更好的原因是服务器端进程不会有任何更新计数器的争用。所以它并不需要使用交易。但即使它确实使用了交易,它也“永远”不得不重试。
答案 1 :(得分:0)
也许Princig常见问题解答可以帮助您...问题:什么是“同步数据库连接”?
这是他们提供的答案:
Firebase对应用程序数据库的同时连接数施加了严格限制。这些限制适用于保护Firebase和我们的用户免受滥用。 Spark计划限制为100,无法提升。 目前,Flame和Blaze计划的初始上限为10,000个并发数据库连接。 此限制与您应用的总用户数不同,因为您的用户并非一次全部连接。我们建议您监控峰值并发数据库连接并在需要时进行升级。 我们正在努力删除Flame和Blaze计划中最初的10,000个同时连接上限。
关于获取当前子女数量的选项,有一个method numbChildren
,但这取决于您的快照...
Here是一些用户正在讨论这个问题。