我有一个Firebase实时数据库结构,如下所示:
rooms/
room_id/
user_1/
name: 'hey',
connected: true
connected
基本上是一个布尔值,指示用户是否已连接,并将使用Firebase提供的onDisconnect()
设置为 false 。
现在我的问题是-如果每次用户的connected
属性更改时都触发云功能,我可以运行setTimeout()
45秒。如果connected
属性仍然为 false ,则在setTimeout()
的末尾(我从db中读取了该特定的连接值),然后删除了用户的节点(例如上面的user_1
节点)。
如果同时触发许多触发器,setTimeout()
会带来问题吗?
答案 0 :(得分:0)
简而言之,云功能可以运行maximum time。
如果您的超时使其在该时间限制到期后被回调,则该函数将已经终止。
考虑使用一种非常简单有效的方法在Cloud Functions中调用称为cron-job的计划代码。
答案 1 :(得分:0)
如果使用setTimeout()
将函数的执行延迟45秒,则可能不足以引起问题。函数的默认超时为1分钟,如果超过该超时,该函数将被迫立即终止。如果您对此感到担心,则只需increase the timeout。
请记住,您要为执行功能的整个时间付费,因此即使暂停功能,也要为该时间计费。如果您想以更有效的方式延迟某些工作以备后用,请考虑使用Cloud Tasks进行安排。
答案 2 :(得分:0)
据我了解,您的功能旨在监视已连接的用户,并正在继续从云功能连接到Firebase进餐时间数据库。正确吗?
为了监视Firebase Realtime数据库,GCP提供了监视数据库performance和usage的工具。
或者只是您只想保持实时连接?
通常,我们建议客户端使用适用于您应用平台的本机SDK,而不是REST API。这些SDK保持开放的连接,从而减少了SSL加密成本和可与REST API相加的数据库负载。
但是,如果您确实使用REST API,请考虑使用HTTP保持活动来维护打开的连接,或者使用服务器发送的事件并设置保持活动,这可以减少SSL握手的成本。