【问题标题】:Firebase "update" operation downloads data?Firebase“更新”操作下载数据?
【发布时间】:2019-01-04 23:36:45
【问题描述】:

我正在分析我的 firebase 数据库中的“下载泄漏”(我正在使用 JavaScript SDK/firebase 函数 Node.js),最后缩小到“更新”功能,这出人意料地导致了数据下载(这会影响我的计费)案例非常重要 - 约 50% 的账单来自此泄漏):

Firebase 函数 index.js:

exports.myTrigger = functions.database.ref("some/data/path").onWrite((data, context) => {
    var dbRootRef = data.after.ref.root;
    return dbRootRef.child("/user/gCapeUausrUSDRqZH8tPzcrqnF42/wr").update({field1:"val1", field2:"val2"})
}

此函数在“/user/gCapeUausrUSDRqZH8tPzcrqnF42/wr”节点生成下载

如果我将路径更改为以下内容:

exports.myTrigger = functions.database.ref("some/data/path").onWrite((data, context) => {
    var dbRootRef = data.after.ref.root;
    return dbRootRef.child("/user/gCapeUausrUSDRqZH8tPzcrqnF42").update({"wr/field1":"val1", "wr/field2":"val2"})
}

它在“/user/gCapeUausrUSDRqZH8tPzcrqnF42”节点生成下载。

这是firebase database:profile的结果

我只需要上传数据,如何在更新数据时摆脱下载或减少使用?

【问题讨论】:

  • 您究竟是如何得出更新功能导致“下载”带宽的结论的?我很震惊您显示的任何代码都会导致实时数据库的输出。
  • @DougStevenson - 更新问题 - 请看一下
  • 可能是SSL encryption overhead安全连接所需的 SSL 加密开销会产生相关成本。平均而言,初始握手的成本约为 3.5KB
  • 感谢@BobSnyder - 问题是这种开销在 5 分钟内触发了 1000 次,与实际有效负载相比,产生了相当多的数据。

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


【解决方案1】:

我认为在 firebase cloudfunction 触发器中是不可能的。

.onWrite((data, context) 有一个data 字段,它是完整的DataSnapshot。 而且没有办法配置不获取它的val

不过,您可以做两件事来帮助降低数据成本:

  1. 注意一个较小的触发器。例如functions.database.ref("some/data/path")("some")
  2. 使用更具体的挂钩。即onCreate()onUpdate()onWrite()

【讨论】:

  • 感谢您的回答。请注意,问题不在“onWrite”中,而是在 .update 中 - 例如,如果我在“onWrite”中返回 null,则没有泄漏。
【解决方案2】:

您应该期望所有操作都会与您的客户端代码往返。否则,客户怎么知道工作何时完成?这需要一些空间来表达。您显示的屏幕截图(非常小且难以阅读 - 考虑将文本直接复制到您的问题中)表明下载数据量非常小。

为了更好地了解真正的成本是多少,运行多个测试,看看这个微小的成本本身是否实际上只是建立连接时客户端和服务器之间的一次性握手的一部分。该成本可能不是问题,因为随着 Cloud Functions 实例的重复使用,您的函数代码会随着时间的推移保持持久连接。

【讨论】:

  • 谢谢 Doug - 问题是在大多数情况下,下载的数据量高达 300-400kb(它正在迅速变成兆字节并不断增长),平均是上传数据的 10 倍本身。它实际上是在每次调用函数时触发的——这是我真正注意到问题的时候
  • 如果您担心计费问题,您应该联系 Firebase 支持以获得处置。 Stack Overflow 可能对你没有帮助。我只能说套接字是双向连接,而您在屏幕截图中显示的是单个操作的极少量数据,这是可以预期的。
  • 感谢 Doug - 我担心与我上传/下载的真实数据相比,此操作需要太多数据。这个特定的屏幕截图可能无法反映问题,但它仍然存在。一般来说,当我的用户使用该应用程序时,firebase 每天下载大约 100mb,而 50mb 来自这个我没想到的特定功能。所以我试图了解这个“更新”是如何工作的,以及是否有任何方法可以改进它。 Firebase 实际上要求在此处发布此类问题。但再次感谢您的意见。
  • 如前所述,请联系 Firebase 电子邮件支持以解决您的具体问题。 Stack Overflow 用于解决可以由整个社区回答的编程问题。如果您对如何计量您的数据以进行计费有疑虑,则此处不适合。
  • 谢谢。我的问题是“更新”是如何工作的,所以我可以正确使用它——账单刚刚触发了这个问题。从您的回复中,我了解到这是我在这里展示的预期内容,对吗?顺便说一句,更新了屏幕截图,以防它提供额外的视角。
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多