【问题标题】:Firebase Functions returns error of Bandwidth ExhaustedFirebase 函数返回带宽耗尽错误
【发布时间】:2021-05-14 13:47:12
【问题描述】:

我们使用 Firebase 函数和几个不同的 HTTP 函数。

其中一项功能通过我们网站上的手动触发器运行。然后它从外部资源中提取大量数据并将其保存到我们的 Firestore 数据库中。我们的函数资源是 Node.js 10、1 GB 内存和超时前 540 秒。

但是,当我们有需要提取的大型数据集时,例如5 000 - 10 000 条记录要写入数据库,我们开始遇到问题。我们在以下大型数据集上收到错误:

8 RESOURCE_EXHAUSTED: Bandwidth exhausted

Firebase Functions Health Dashboard 日志中的完整错误如下所示:

Error: 8 RESOURCE_EXHAUSTED: Bandwidth exhausted
at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:176:52)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:342:141)
at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:305:181)
at Http2CallStream.outputStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:117:74)
at Http2CallStream.maybeOutputStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:156:22)
at Http2CallStream.endCall (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:142:18)
at ClientHttp2Stream.stream.on (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:420:22)
at ClientHttp2Stream.emit (events.js:198:13)
at ClientHttp2Stream.EventEmitter.emit (domain.js:466:23)

我们的 Firebase 项目正在启动计划中,并且还在连接到有效结算帐户的 GCP 上。

在 GCP 上进行检查后,我们似乎没有超出我们的每分钟 WRITES 报价,正如之前所认为的那样,但是,我们超出了我们的 Cloud Build 限制。当我们从函数内将数据保存到 firestore 时,我们也在使用批量写入,这似乎也减少了 db 写入量。例如

我们不使用 Cloud Build,所以我假设 Firebase Functions 在后端使用 Cloud Build 来运行这些函数或其他东西,但我找不到任何关于此事的文档。我们还有一些在创建文档时运行的 firestore 数据库函数。不确定这是否在后端使用 Cloud build。

知道为什么会发生这种情况吗?每当发生这种情况时,我们的函数就会因该错误而终止,这导致我们只导入一半的数据。数据导入可以完美地处理少量数据。

在此处查看我们对这个特定项目的使用情况:

【问题讨论】:

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


    【解决方案1】:

    Cloud Build 在部署 Cloud Functions 期间使用。如果您检查此documentation,您会看到:

    通过将包含函数源代码的存档上传到 Google Cloud Storage 存储分区来进行部署。上传源代码后,Cloud Build 会自动将您的代码构建到容器映像中,并将该映像推送到 Container Registry。 Cloud Functions 使用该映像来创建执行您的函数的容器。

    这本身不足以证明您看到的指控是合理的,但如果您查看container image documentation,它会说:

    由于整个构建过程都在您的项目上下文中进行,因此该项目受包含资源的定价影响:

    • 有关 Cloud Build 定价,请参阅定价页面。此过程使用 Cloud Build 的默认实例大小,因为这些实例已预热并且可用更快。 Cloud Build 确实提供免费套餐:请查看定价文档以了解更多详情。

    因此,考虑到这些信息,我会做出有根据的猜测,即您的网站触发 HTTP 函数的次数足以使 Cloud Functions 使用新实例扩展此特定函数,这会触发容器的构建过程托管函数并向您收取 Cloud Build 费用。因此,要继续做您正在做的事情,您将不得不增加您的 Cloud Build Quota 以满足您网站的这一需求。

    【讨论】:

      【解决方案2】:

      有一个 Firestore 触发器正在触发我正在导入的同一类型的新记录。

      简而言之,我在一个集合中创建了数千条记录,并且对于每一条记录,firestore 规则(函数)都会触发,但我当时不知道的是,它创建了一个新的构建过程在每个运行的 Firestore 触发器的后台,这在任何地方都没有记录。

      【讨论】:

        猜你喜欢
        • 2019-08-21
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 2021-05-04
        • 2020-04-07
        • 1970-01-01
        相关资源
        最近更新 更多