【问题标题】:How can I keep objects stored in firebase cloud function RAM?如何将对象存储在 Firebase 云功能 RAM 中?
【发布时间】:2017-12-05 00:24:15
【问题描述】:

我的应用程序需要在处理用户请求之前构建几个大型哈希图。理想情况下,我想将这些哈希图存储在机器上的内存中,这意味着它永远不必进行任何昂贵的处理,并且可以快速处理任何传入的请求。

但这不适用于 firebase,因为用户有可能触发一个新实例,这会引发非常耗时的预处理步骤。

因此,我尝试将我的应用程序设计为使用 firebase 数据库,并且每次仅从数据库中获取所需的数据,而不是将所有数据保存在内存中。但是,由于云功能正在从数据库中下载大量数据,我现在已经触发了本月超过 1.7 GB 的下载量,仅靠我自己进行测试。这超出了配额。

一定有我遗漏的东西;我想要的只是一些哈希图的永久内存存储。我想要的只是在通过请求调用函数时这些哈希图准备就绪。这似乎是一个简单的要求;为什么没有办法做到这一点?

【问题讨论】:

  • 您在一天内问了 3 次同一个问题。我建议坚持一个问题并更新它,并随着更多数据的披露参与 cmets。要回答这个问题 - 如果向 Firebase 添加数据会导致您的应用每次都下载大量数据,那么您可能做错了。 childAdded 事件在这些情况下很有用。该事件仅向应用程序显示新添加的数据,然后您可以将其集成到内存数据集中。投票结束,因为这是一个多余的问题。
  • 另外,如果你使用 singleEvent 实现一个观察者,那么你的数据只会被下载一次,不会再被下载。即使在 Firebase 中添加、更改或删除数据,应用也不会收到事件,直到下一次运行并调用 singleEvent。

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


【解决方案1】:

如果您想将数据存储在运行 Cloud Functions 的容器中,您可以使用its local tempfs,它实际上保存在内存中。但是当容器被回收时这会消失,当你的函数有一段时间没有被访问时会发生这种情况。因此,每当容器启动时,都必须重建这个本地文件系统。

如果您希望永久存储您生成的值,请考虑使用 Google Cloud Storage。它可能是一种更具成本效益的选择,而且无疑是最具可扩展性的选择。

【讨论】:

  • 感谢您的回答。实际上,我确实尝试过使用云存储,我用它来存放一堆 csv,我会读入 /tmp 目录,然后将它们转换为哈希图。问题就像你提到的,当容器被重置时,它必须重新做一遍,对吗?我看不出云存储是如何避免这种情况的,因为我仍然需要将数据读入服务器以将其处理成哈希图。
  • 我终于意识到,我的代码这么慢的原因是它在声明之前就在云函数之外运行(我不知道为什么它会变慢)。一旦我将它放入云功能中,它就会运行得非常快。问题是,如果我必须在每次请求时重新下载整个数据库来构建哈希图,这是一个非常不可持续的解决方案,因为我会很快耗尽存储带宽。肯定有更好的方法吗?
  • 很高兴听到你想通了。如果没有看到重现问题的代码,我无法评论任何更好的方法。这就是为什么我只解释了系统是如何工作的。
  • 谢谢,我没有最少的代码,因为我的问题更多是关于为什么我需要为这样一个简单的需求产生配额。另一个澄清:我认为我的请求应该非常合理的原因是,我可以通过在代码中逐字声明整个 80 MB 的 hashmaps 数据来完成它。也许我会编写一个脚本来枚举 js 中的所有这些字段并将其放入 index.js 本身?然后它永远不必从任何地方下载,也不会产生任何配额。然而,对于看似简单的问题,这似乎是一个非常绝望的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 2021-10-16
  • 1970-01-01
  • 2019-04-16
  • 2021-10-28
  • 2017-10-09
  • 2022-01-11
  • 2019-08-08
相关资源
最近更新 更多