我应该为每行插入都调用BigQuery还是应该插入批量?

时间:2019-05-29 18:12:48

标签: node.js performance express google-bigquery

我有一个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;

1 个答案:

答案 0 :(得分:0)

我不确定问题中是否有足够的信息来提供对此的一目了然的答案,因为您当前对每个请求方法的交易似乎没有遇到任何硬性限制。如果服务在每个批量事务之间失败,则收集进行批量事务的请求可能会帮助限制网络I / O,但可能会丢失事务。我建议进行性能测试以提供每种方法的直接比较,并了解它们在您的用例中的利弊。

您忽略的最后一件事可能是成本,具体取决于单个行的大小。基于BigQuery cost projections

  

使用最小1 KB的大小计算单个行

根据对象的大小,如果您有足够小的行,除非将它们捆绑成批量交易,否则可能会收取过多的费用