当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库复制了原子服务器值。接触不良时的增量

公冶峰
2023-03-14

在这个问题的答案中,@Frank van Puffelen解释了实时数据库增量原子操作ServerValue.increment(1)是如何工作的:

    Client            Server                Client

               +                   +                   +
  increment(1) |                   |                   |
               |                   |                   | increment(1)
               |  (increment, 1)   |                   |
               +--------->---------+   (increment, 1)  |
               |                   |---------<---------+
               +---------<---------+                   |
               |      (ack, 2)     |--------->---------+
               |                   |     (ack, 3)      |
               |                   |                   |
               v                   v                   v

如果在发送“(增量,1)”后,客户端以某种方式失去连接而没有接收“(ack,2)”,该怎么办?

在我的测试中,它只是重试,有时会导致重复增量。有时会在连接不良的情况下发生。:(

这是一种预期的行为吗?

要复制测试,只需在反复打开和关闭internet连接(WiFi或4G)的同时执行以下示例,以模拟不良连接情况:

val updates: MutableMap<String, Any> = HashMap()
updates["posts/$key/starCount"] = ServerValue.increment(1)
updates["user-posts/$uid/$key/starCount"] = ServerValue.increment(1)
database.updateChildren(updates)

共有1个答案

洪楷
2023-03-14

我不期望这种情况经常发生,但这是可能的。如果你发现这种情况发生得比你认为可以接受的要多,你有两个选择:

  1. 考虑使用事务而不是原子增量。与原子增量不同,事务在没有连接时失败
  2. 提出允许第一个增量和拒绝附加的安全规则,本质上使增量是幂等的
 类似资料: