【问题标题】:Efficient way yo sink Pub/Sub messages to BigQuery using Cloud Functions使用 Cloud Functions 将 Pub/Sub 消息发送到 BigQuery 的有效方式
【发布时间】:2021-12-04 19:49:59
【问题描述】:

使用 Cloud Functions 的推荐方法之一是通过 Pub/Sub Push 订阅调用它们,以将 Pub/Sub 消息写入 BigQuery。我的消息非常小,而且数量很多。

我为写入 GBQ 的 60.000.000 条消息支付了大约 80 美元。我的 GCF 的配置是 128 MB,1 秒超时。

源代码:

exports['write-to-gbq'] = async (event, context) => {
  const message = JSON.parse(Buffer.from(event.data, 'base64').toString())
  const dataset = bigquery.dataset('dataset')
  const table = dataset.table('table')
  await table.insert({...message, created_at: new BigQueryDatetime(String(new Date().toISOString()))})
};

有没有办法将成本降低 10 倍以上? Compute Engine 实例似乎要便宜得多,但也许我做错了什么?

【问题讨论】:

  • 看看你的账单。成本如何分解(百分比)。 BQ 是多少,Pub/Sub 等是多少?您的功能要求是什么......例如......是否可以接受延迟,以便插入被批处理并且不能尽快在 BQ 中可用?
  • $80 仅适用于 Cloud Function。 GBQ 账单只有 8 美元,与这个水槽几乎没有关系。我猜这是更多的查询。延迟最多几个小时是可以的。

标签: google-bigquery google-cloud-functions


【解决方案1】:

您可以使用 Cloud Run。您可以通过 PubSub 推送订阅触发它,但您可以在同一个实例上处理多个并发消息,而 Cloud Functions 一次只接受 1 条消息。

您需要为实例的运行时间付费(按 CPU 时间和内存时间收费)。我写了(一个相当老的,有点过时的)article on that

现在每个实例在 GA 中最多可以有 250 个并发请求,在预览中最多可以有 1000 个并发请求。您可以加快流程并降低成本。

【讨论】:

  • 谢谢!我知道这种方法。我只是认为 GCF 已针对此类任务进行了优化。
  • 这是 GCF(以及一般的 FaaS)的目的:将组件粘合在一起。但是,当量很大时,其他产品比其他产品更好,因为它不仅仅是 GLUE,它是一个真正的管道!
  • 也许你是对的。那么,在这种情况下,您可能应该建议使用 Compute Engine 抢占式实例,而不是 Cloud Run。
  • 如果您使用 Compute Engine(或 GKE Autopilot)进行长时间运行的操作,首选 PubSub 拉取操作而不是 Push 操作。它在带宽、吞吐量和处理方面更高效
【解决方案2】:

您可以为此目的使用数据流模板,如下图所示

【讨论】:

  • 我试过一次,它似乎更复杂更昂贵。另外,我转换了输入,如您所见,我添加了“created_at”属性。
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 2022-01-01
  • 2020-02-21
  • 1970-01-01
  • 2022-08-22
  • 2021-12-31
  • 2022-01-01
  • 2023-01-12
相关资源
最近更新 更多