【问题标题】:How can I structure Firebase FCM token storage to scale?如何构建 Firebase FCM 令牌存储以进行扩展?
【发布时间】:2020-03-11 15:12:05
【问题描述】:

我的网络应用程序将具有基于“线程”和“消息”的聊天功能。

在任何给定线程中,2 人或更多人可以订阅新消息通知。

任何给定的人都可以拥有多个设备,每个设备都有一个相应的 FCM 令牌(在获得向他们发送通知的权限后获得)。

假设我有一个线程“猫”,有 3 个订阅者。文档结构如下:

id: "thread1"
  title: "cats"
  subscribers:["uid1","uid2","uid3"]

我为这三个用户存储了 FCM 令牌。文档结构如下:

id: "token1"
  tokenOwner: "uid1"
id: "token2"
  tokenOwner: "uid2"
id: "token3"
  tokenOwner: "uid2"
id: "token4"
  tokenOwner: "uid3"
id: "token5"
  tokenOwner: "uid4"

要在thread1 中发送新消息通知,我需要在 FCM 令牌集合中查询tokenOwner 在提供的数组["uid1","uid2","uid3"] 中的任何令牌。

该查询看起来像这样:

db
  .collection("fcmTokens")
  .where('tokenOwner', 'in', ["uid1","uid2","uid3"])
  .get()...

在 Cloud Firestore 查询限制出现之前,这非常有效:

使用 in 运算符在 具有逻辑 OR 的相同字段。 in 查询返回文档,其中 给定字段匹配任何比较值。

我最多只能在数组查询中包含 10 个 uid。如果有 12 人订阅了该线程,我要么不走运,要么需要运行多个查询,这似乎效率低下。

如何以“Firebase 友好”的方式构建 FCM 令牌?

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-cloud-messaging


    【解决方案1】:

    针对这种情况运行多个查询并不是真的低效。所有请求都通过单个连接进行管道传输,您应该能够通过快速连接在几毫秒的时间内获得所有请求。新的“in”查询主要是为了成为不必执行多个查询的便利层,而不是为了优化(除非它阻止您从多个查询中多次获取相同的文档)。您应该对您现在拥有的一切感到满意 - 在您真正观察到性能问题之前,无需过早地对其进行优化。

    就我个人而言,我会根据用户的 UID 为用户存储令牌,而不是将所有用户的令牌放在一个集合中。

    Collection: user-tokens
      Document ID: {uid}
        - tokens: [ array of tokens for the user ]
    

    然后,要获取用户的所有令牌,只需获取包含所有令牌的文档。

    如果您担心用户可能使用数千台设备并且令牌的数量可能会超出单个文档的容量,则将每个令牌存储在单独的文档中,并在整个子集合中查询用户的令牌:

    Collection: user-tokens
      Document ID: {uid}
        Subcollection: tokens
          Document ID: {random}
            - token: string
    

    在 UID 下组织令牌还可以更轻松地编写安全规则,以便只有特定用户可以读取和写入他们自己的令牌,如果这是您想要控制的东西。

    【讨论】:

    • 把这个放在这里,这种方法的局限性在于,当线程中的用户越多时,读取请求(成本也会增加)会增加
    猜你喜欢
    • 2018-05-04
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多