我有一个NodeJs服务(在Express上构建),每天有100M个请求,对于每个请求,一个新的数据行将发送到BigQuery。 从性能角度来看,最好是继续单独发送行,还是应该收集行,每隔X秒/分钟将行批量发送到BigQuery? (调用是异步完成的)
我的BigQuery储存库类看起来像这样:(在Express服务启动时,储存库通过调用.init()进行初始化,并为每行插入服务调用.add())
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;
答案 0 :(得分:0)
我不确定问题中是否有足够的信息来提供对此的一目了然的答案,因为您当前对每个请求方法的交易似乎没有遇到任何硬性限制。如果服务在每个批量事务之间失败,则收集进行批量事务的请求可能会帮助限制网络I / O,但可能会丢失事务。我建议进行性能测试以提供每种方法的直接比较,并了解它们在您的用例中的利弊。
您忽略的最后一件事可能是成本,具体取决于单个行的大小。基于BigQuery cost projections:
使用最小1 KB的大小计算单个行
根据对象的大小,如果您有足够小的行,除非将它们捆绑成批量交易,否则可能会收取过多的费用。