Firebase Cloud功能:使用sendToDevice()

时间:2019-02-17 05:37:38

标签: android firebase firebase-cloud-messaging google-cloud-functions

我已经在Firebase中使用Cloud Messaging功能,并使用了sendToTopic()旧版方法向所有订阅者发送通知,但是我在应用程序中遇到了使用主题的局限性。现在,我想通过使用存储在地图对象中的用户文档中注册的设备令牌向每个设备发送通知,来管理发送和接收通知的方式。我将遍历每个设备令牌,并使用sendToDevice()向每个设备发送通知。

我现在有了一个名为 new_added 的函数,该函数会在将新文档添加到集合中时触发。现在,每次调用 new_added 函数时,都会迭代到Users集合中的每个文档,并在Notification集合下写入一个新文档。结构为Users (collection)> uid (document)> Notifications> docNotification集合下的每个新添加的项目都将触发服务器中的功能。如果有百万用户,此操作特别繁重,是否可以在540秒之内使用Cloud Function在服务器端执行这种操作,这被称为触发后功能的最大运行时间?我真的希望它能以这种方式工作。有没有什么工具可以帮助减少操作?

1 个答案:

答案 0 :(得分:0)

如果听起来您正在尝试实施自己的FCM消息扇出,则将相同的消息发送给许多用户。这类似于FCM主题消息传递已经完成的工作,我现在肯定会考虑使用它。

但是,如果您想自己实现它,请考虑如何针对基础系统对其进行优化。由于您将令牌存储在Firestore中,因此阅读的文档数量是成本的关键因素。

减少阅读文档数量的一种方法可能是将一组设备的令牌存储到单个文档中。例如,您可以为每个“主题”创建一个文档,并在将令牌写入数据库时​​将令牌添加到该文档。然后,当您需要向所有设备发送有关某个主题的消息时,只需阅读该主题文档,即可一次性获得所有令牌。如果您以包含标记的主题为文件命名,例如,这将变得特别简单。 mytopic-tokens

此方法的主要问题是文档不能大于1Mb。假设令牌最多为256个字节(它们为seem to be 152-162 characters),则可以在文档中存储4000个令牌。如果您有更多令牌,则需要创建多个文档。一个简单的命名方案可以在这里走很长的路,例如mytopic-tokens-1mytopic-tokens-2等。您可以在Firestore中使用单个范围查询来获取所有这些文档。