【问题标题】:Firebase Functions: Support Global variable across functionsFirebase 函数:支持跨函数的全局变量
【发布时间】:2019-03-12 06:28:36
【问题描述】:

我想在 http firebase 函数中缓存最近的记录(比如最近 24 小时)。 在 http firebase 函数(比如 fetchLastXRecords)中,如果未找到从数据库中获取并设置缓存,我会在缓存中查找记录(定义的全局变量来存储记录)。

当我想更新任何缓存记录时出现问题,因为其他 Firebase 函数无法访问此全局变量(可能是实时数据库更改触发器)。

什么是更新缓存中记录的好方法?我可以调用缓存 http firebase 函数并传递更新的记录吗?或者我可以将更新的记录存储在数据库中,然后缓存功能在数据库中查找并更新缓存记录?

【问题讨论】:

  • 云函数应该是无状态的,因为每个函数都可以在单独的实例上运行。缓存是一种有效的方法,但您需要确保它为每个函数调用自动初始化。我不确定全局变量的问题是什么,所以请查看how to create a minimal, complete, verifiable example
  • @FrankvanPuffelen 似乎我无法跨函数共享内存对象。任何全局变量(在函数范围外定义)仅用于单个函数的多次调用。
  • Cloud Functions 支持全局变量:cloud.google.com/functions/docs/concepts/…

标签: firebase caching firebase-realtime-database google-cloud-functions


【解决方案1】:

在 Cloud Functions 中,您无法确保代码中存在可供您的函数访问的全局变量。关于 Cloud Functions 的工作原理,您需要了解两件事:

  1. 在负载下,将分配多个服务器实例来运行您的功能。这些服务器实例不共享任何状态。
  2. 您的每个功能都部署到不同的服务器实例。两个函数永远不会在同一个服务器实例上运行。

因此,如果您有任何值要在函数之间共享,您应该使用持久性机制,例如数据库。当您的函数需要读取和写入共享值时,它们应该访问数据库。此外,他们应该使用某种原子事务来确保多个并发读写是安全的。

【讨论】:

  • 是的,Doug,无法缓存在内存中。数据库看起来只有选项。
  • Cloud Functions 确实支持全局变量:cloud.google.com/functions/docs/concepts/…
  • @LaszloSchürg 该文档的意思是,您必须使用另一个产品在在不同服务器实例上运行的函数调用之间共享数据。 JavaScript 全局变量只能由在同一实例上运行的函数调用访问。 Cloud Functions 本身没有跨实例共享的功能。这就是我最后一段要说的——你应该使用持久性机制,比如数据库。
  • True 是全局变量的范围/生命周期仅针对每个函数实例,您需要考虑这一点。该文档确实有关于缓存的建议:“因此,建议在可能的情况下在全局范围内跨调用缓存状态。您的函数仍应准备好在没有此缓存可用的情况下工作......”cloud.google.com/functions/docs/concepts/…
  • @LaszloSchürg 这里的关键词是“尽可能”。 OP 正在询问不共享全局范围的多个功能。在这种情况下,需要一种持久性机制来在调用之间共享数据。
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多