use*_*936 5 firebase firebase-realtime-database google-cloud-functions firebase-admin
对于大型项目,使用 firebase admin 从云函数中的集合检索数据失败。我用来查询云函数选择的示例代码如下
admin.database().orderByChild('mmyyyy').equalTo(month).once('value');
Run Code Online (Sandbox Code Playgroud)
当我尝试检索 10600 个项目(试图找出原因)时,此调用失败。在谷歌控制台中有这个日志,但没有其他可以指出我正确的方向
textPayload: "Function execution took 18547 ms, finished with status: 'response error'"
Run Code Online (Sandbox Code Playgroud)
经过多次失败的尝试后,我决定尝试使用 firebase sdk 在客户端上执行此调用,如下所示:
result = await firebase.database().ref(`transactions`).orderByChild('mmyyyy').equalTo(month).once('value');
Run Code Online (Sandbox Code Playgroud)
这在客户端上完美运行,没有错误,并返回我的所有项目,其中 17000 个(该 json 的大小为 26MB)。
为什么会这样呢?是否有任何未记录的限制?
注意:我将云功能内存增加到 1GB,超时时间增加到 5 分钟,但没有帮助。
这是完整的示例代码
admin.database().orderByChild('mmyyyy').equalTo(month).once('value');
Run Code Online (Sandbox Code Playgroud)
我做了一些测试并得出结论,当查询产生大量结果(即许多数据存储实体)时,Google Cloud Functions (GCF) 会强制执行某种超时或“中止”操作。请参阅我对此问题所附的评论以了解一些背景信息。
tl;dr 我创建了自己的 Express.js 网络服务器并在其上运行我的 GCF 代码。
我是这样测试它的:我创建了一个启用了 http/https 并启用了数据存储 API 的 ubuntu 实例。在我的实例上,我安装了 Node、Express,并让基本的 https 服务器正常工作(自签名证书工作正常,因为这只是测试 api 后端服务)。然后我将 GCF 代码(GCF 中失败的函数)复制粘贴到我的最小 Express 网络服务器中。我指示我的 React 应用程序使用我的实例,这触发了一个查询,导致超过 32,000 个数据存储实体。datastore.runQuery()我的 GCF 函数发送一个常见的查询。
大约花了一分钟,但最终所有 32,000 个实体都由 Express 提供服务并加载到 React 应用程序(浏览器)中,没有任何错误。
基本的 Express 路线调用我的 GCF 函数:
app.post('/foo', (req, res) => {
myCloudFunction(req, res);
})
const myCloudFunction = (req, res) => {
// Inspects req, queries Datastore, and returns the results.
};
Run Code Online (Sandbox Code Playgroud)
对于此测试,我的 React 应用程序仅指向https://mydomain.example.com:3000/foo (因为我的 Express 服务器侦听端口 3000)。
所以看来 GCF 对于我的应用程序来说不够好,除非我向应用程序添加分页(这在路线图上)。
| 归档时间: |
|
| 查看次数: |
2026 次 |
| 最近记录: |