【问题标题】:Managing pushtokens in firebase realtime db在 Firebase 实时数据库中管理推送令牌
【发布时间】:2019-06-27 00:47:00
【问题描述】:

我们的应用程序以 >1M 的顺序被人们使用,它不需要任何类型的登录等。我们使用带有 ionic 的 firebase sdk 来获取设备的推送令牌。问题是我们如何有效地存储它们。我们应该使用

const itemsRef = db.list('tokens');
itemsRef.push({ token:"tokenValue" });

每次设备打开应用程序时,上述内容都会不断添加一个新节点。我在这里担心的是避免再次添加相同的 pushToken。如上面针对一百万个节点的结构查询以查看是否存在推送令牌可能是一个巨大的性能问题(我认为不确定)。

处理此问题的建议是什么?如果存在推送令牌,我觉得查询它可能很昂贵。

【问题讨论】:

    标签: firebase ionic-framework firebase-realtime-database push-notification cordova-plugin-fcm


    【解决方案1】:

    一般而言,您可以在单个节点下存储大量密钥。事实上,我认为没有documented limit。虽然我很确定它停止工作的理论值,但你不太可能在真正的应用程序中遇到它。它只是存储一些数据,所以没有什么能阻止你在这里存储数百万个值。

    棘手的一点是再次将这些数据从数据库中取出。但是例如,如果你知道你要读取的数据的确切位置,并且你正在读取的数据大小是合理的,那么它的限制又是相当高的。

    只有当您想要读取/查询您遇到限制的键列表时。这里的常见建议是您不应该查询超过几十万个子节点,尽管在过去几年中这个数字似乎有所上升。但是查询(或读取)数百万个节点将成为性能问题。

    我担心的是避免再次添加相同的 pushToken。

    如果您希望某个值在数据库中是唯一的(无论您使用的是实时数据库还是 Cloud Firestore),您都应该使用该值作为节点的键(或 Firestore 中文档的 ID) )。在代码中:

    const itemsRef = db.list('tokens');
    itemsRef.child("tokenvalue").set(true);
    

    根据定义,键在其父节点中是唯一的,因此使用推送令牌作为键自动保证每个推送令牌只有一个子节点。

    【讨论】:

    • 因为这些是推送令牌,所以我们需要在服务器端的 firebase 函数中读取它们。用例是有一个文章节点。每当管理员添加新文章时,firebase db create 触发器就会触发,并且需要将通知推送到所有设备。因此,无需向我们查询,因为它涉及到所有人。使用令牌本身作为键的方法,您是否看到任何问题?
    • 我描述了系统的限制,正是为了帮助您自己回答后续问题。读取数百万个节点将是一个问题,对于服务器的内存使用您消耗的带宽。但是,如果您不需要查询,为什么您的问题会说:“如在上述结构中查询一百万个节点以查看推送令牌是否存在”?
    • 很抱歉造成混乱。我的问题的查询部分是针对我最初认为确保 pushTokens 是唯一的方法。你已经回答了。我的第二个担忧是阅读所有内容以发送推送通知。所以,在那种情况下,我只需要在令牌节点下从上到下的所有令牌。因此,我询问是否有关于处理服务器端代码以读取数百万个推送令牌并使用 Firebase 消息发送到设备的任何建议。
    • 正如我所说,一次可以读取多少个子节点是有实际限制的。如果您需要超出此范围的数量,我建议您对令牌进行分片。例如:创建一个层次结构,将每个标记放在与该标记的第一个字符相同的父节点下:/tokens/0/01231237/tokens/0/047324/、/tokens/1/128759/tokens/1/12asd9 等。这样你可以循环遍历(硬编码的)分片名称,并读取一部分标记。
    • 这将是相同的迭代,只是超过一个更长的字典。我不确定这会有什么不同,但无论哪种方式:如果你想要所有令牌,你将需要读取所有存储桶/分片。
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2021-08-28
    • 1970-01-01
    • 2019-12-21
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多