【问题标题】:Firebase Realtime Database duplicated atomic ServerValue.increment on poor connectionFirebase 实时数据库在连接不良时重复原子 ServerValue.increment
【发布时间】:2021-07-10 15:46:03
【问题描述】:

question answer 中,@Frank van Puffelen 解释了实时数据库如何增加原子操作 ServerValue.increment(1) 工作:

    Client            Server                Client

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

如果在发送“(increment, 1)”之后,客户端不知何故失去了连接并且没有收到“(ack, 2)”?

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

这是预期的行为吗?

要重现测试,只需在反复打开和关闭互联网连接(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)

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

我不认为这种情况会发生很多,但它可能的。如果您发现这种情况发生的次数超出了您认为可以接受的范围,您有两种选择:

  1. 考虑使用事务而不是原子增量。与原子增量不同,没有连接时事务会失败。
  2. 提出安全规则,允许第一次增量并拒绝其他增量,本质上使增量幂等。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2021-07-28
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多