Node.js 我应该为每一行插入调用BigQuery还是插入一个大容量?
我有一个NodeJs服务(基于Express构建),每天有100万个请求,对于每个请求,一个新的数据行被发送到BigQuery。 从性能角度看,继续单独发送行更好,还是应该收集行并每隔X秒/分钟将它们作为批量发送到BigQuery?(调用是异步完成的) 我的BigQuery存储库类如下所示:(在Express服务启动时,通过调用.init()初始化存储库,并为每一行插入服务调用.add())Node.js 我应该为每一行插入调用BigQuery还是插入一个大容量?,node.js,performance,express,google-bigquery,Node.js,Performance,Express,Google Bigquery,我有一个NodeJs服务(基于Express构建),每天有100万个请求,对于每个请求,一个新的数据行被发送到BigQuery。 从性能角度看,继续单独发送行更好,还是应该收集行并每隔X秒/分钟将它们作为批量发送到BigQuery?(调用是异步完成的) 我的BigQuery存储库类如下所示:(在Express服务启动时,通过调用.init()初始化存储库,并为每一行插入服务调用.add()) 我不确定问题中是否有足够的信息来提供一个简单的答案,因为您当前的每请求事务处理方法似乎没有达到任何硬限制
我不确定问题中是否有足够的信息来提供一个简单的答案,因为您当前的每请求事务处理方法似乎没有达到任何硬限制。收集执行批量事务的请求可能有助于限制网络I/O,但如果服务在每次批量事务之间失败,则可能会丢失事务。我建议您进行性能测试,以直接比较每种方法,并了解它们在您的用例中的优缺点 最后一件您忽略的事情可能是成本,这取决于单个行的大小。基于以下原因: 单个行的最小大小为1 KB
根据对象的大小,如果您的行足够小,则可能会被多收费,除非您将它们捆绑到批量事务中。您正在寻找什么的性能优化?消费者;节点;服务器RAM/CPU?起初我的目标是服务器CPU负载,但我认为所有性能标准都很有趣
function BQRepository() {
}
BQRepository.prototype.init = async function() {
this.bigQueryClient = new BigQuery({ projectId: ..., keyFilename: ... });
}
BQRepository.prototype.add = async function(tableName, obj) {
this.bigQueryClient
.dataset(...)
.table(tableName)
.insert(obj)
.then(() => {
logger.debug(`object added`)
})
.catch(err => {
logger.error('error occurred')
});
}
var bqRepo = new BQRepository()
module.exports = bqRepo;