在Firebase函数中使用节点获取进行批量获取



我正在尝试从iexoud api批量获取,一次100个符号的字符串,使用firebase函数。我的第一个fetch正确地响应并写入DB。在我第二次打电话时,我总是遇到"客户端网络套接字在建立安全TLS连接之前断开"的情况。. .我不知道我在这里做错了什么:

const functions = require("firebase-functions");
const fetch = require("node-fetch");
const admin = require("firebase-admin");

admin.initializeApp();
const db = admin.firestore();

exports.scheduledFunctionCrontab = functions.pubsub
.schedule("0 09-17 * * 1-5")
.timeZone("America/New_York") // Users can choose timezone - default is America/Los_Angeles
.onRun(async () => {
const promises = [];
const positions = await admin.firestore().collection("positions");
const tempDoc = [];
await positions.get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
tempDoc.push(doc.id);
});
return tempDoc;
});

// Let's break this into groups of 100.
let positionsObject = tempDoc.reduce((resultArray, item, index) => {
let perChunk = 100; // items per chunk
const chunkIndex = Math.floor(index / perChunk);
if (!resultArray[chunkIndex]) {
resultArray[chunkIndex] = []; // start a new chunk
}
resultArray[chunkIndex].push(item);
return resultArray;
}, []);
async function databaseWrite(json) {
...
// writing to the DB
...
}

async function getCurrentPrice() {
for (const symbols of positionsObject) {
let ourPositionsString = symbols.toString();
const API_Call = `https://sandbox.iexapis.com/stable/stock/market/batch?symbols=${ourPositionsString}&types=quote&token=TOKEN`;
const fetchResponse = await fetch(API_Call, {
method: "GET",
agent: false,
});
const json = await fetchResponse.json();
await databaseWrite(json);
}
}
getCurrentPrice();
return Promise.all(promises);
});

databaseWrite工作,API_Call循环成功与一个新的ourpositionsstring正确的100个位置,但第二次获取响应总是套接字断开。

在Firestore上进行大量的写操作有三种方式:
1;按顺序执行每个单独的写操作。
2。使用批处理写操作。
3。并行执行单个写操作

在Firestore上执行批量数据写入的最快和最有效的方法是执行并行的单个写入操作。对于批量数据输入,使用具有并行单独写入的服务器客户机库。你应该使用服务器客户端库进行批量数据操作,而不是移动/web SDK。

批处理写性能优于序列化写,但不优于并行写。批处理写入通过调用batch()创建一个BatchedWrite对象,直到它拥有500个文档的最大容量,然后将其写入Firestore。该解决方案计算对批处理进行的每个操作,并且在达到限制后创建新批处理并将其推送到batchArray。所有更新完成后,代码循环遍历batchArray并提交数组内的每个批处理。对set()update()delete()操作进行计数是很重要的,因为它们都计数到500个操作限制。

看看下面的线程对Firestore批量写入的参考:

[1]: https://firebase.google.com/docs/firestore/quotas
[2]: https://firebase.google.com/docs/firestore/client/libraries#server_client_libraries
[3]: https://stackoverflow.com/a/58897275/15803365

相关内容

  • 没有找到相关文章

最新更新