如何使用云函数将 PubSub 数据存储到大查询?

How to store PubSub data to big query using cloud functions?

我再次请求您的帮助。

先说说我的现状吧

  1. 我有一个连接到“Cloud IoT core”并使用 mqtt 发送数据的设备。
  2. 数据然后转到 Pub/Sub 主题。
  3. 然后触发“云功能”,将数据存储在“Firestore”中
  4. 另一个“云功能”被触发,它向我发送了一封电子邮件,其中包含 Firestore 中存储的数据。

数据大小约为 1 KB,我预计每月发送约 10,000 条消息

我需要这些数据来创建我正在使用“Google Data Studio”的仪表板

为了在其中获取我的数据,我安装了 Firebase 扩展“将集合流式传输到 BigQuery”以将数据发送到“BigQuery”。从那里我只需单击几个按钮即可自动将数据从 BigQuery 流式传输到“Google Data Studio”

到目前为止一切正常,但如您所见,我存储了 4 次数据。一次通过电子邮件,一次在 firestore 中,一次在 BigQuery 和 Data studio 中。从长远来看,所有这些都将花费大量资金,因为存储的数据每个月都会翻一番。

我需要你们提供一些最佳实践建议。

当数据到达 Pub/Sub 时,有没有办法将数据直接存储在 BigQuery 中? 如果可以,我也可以将数据作为附件发送电子邮件吗?

BigQuery 是一个好的解决方案还是我应该使用“Cloud SQL”?

要在 Firestore 中保存数据,我可以在云函数中执行以下操作。 BigQuery 有类似的方法吗?

    firestore.collection("put Collection name here").doc(put document name here).set({
        'name' : name
        'age' : age

    }).then((writeResult) => {
        //console.log('Successfully executed set'); 
        return;
    }).catch((err) => {
        console.log(err);
        return;
    });

Is there a way to store the data directly inside BigQuery when it arrives in the Pub/Sub?

是的,您可以使用 Dataflow 构建流式传输管道,如不同文档项或博客中所述:

但您也可以在云函数中使用 Node.js Client for BigQuery,由 Pub/Sub 触发。但是,可以认为这不会“直接 存储数据 ”...

If so can I also send an email with the data as an attachment?

如果您使用 Cloud Function,那很容易,例如使用专用 "Trigger Email" Firebase Extension.

您还可以使用 nodemailer 包直接从 Cloud Functions 发送电子邮件,请参阅此 official Cloud Function sample

Is BigQuery a good solution or should I use "Cloud SQL"?

这完全取决于您的确切用例...网上有很多文献:https://www.google.com/search?client=firefox-b-d&q=difference+between+Cloud+SQL+and+BigQuery

但是,由于您要使用 Data Studio,所以经典的答案是使用 BigQuery,因为它最适合分析。但同样,这取决于您的具体用例。

(请注意,这个问题本身可能会在 SO 上结束,因为它是 opinion based)。

To save data inside Firestore I can execute the following inside a cloud function. Is there a similar way for BigQuery?

是的,如上所述,在您的 Cloud Function 中使用 Node.js Client for BigQuery