如何通过Cloud Functions将Pub/Sub数据存储到BigQuery及最佳实践咨询
物联网数据存储架构优化最佳实践解答
问题1:是否可在Pub/Sub接收到数据时直接通过Cloud Function将数据写入BigQuery,同时支持将该数据作为附件发送通知邮件?
完全可以实现,该方案可以从根源减少你的数据冗余问题。你可以将原有两个Cloud Function的逻辑合并为一个:监听Pub/Sub主题触发后,先解析终端上报的物联网数据,同步执行两个操作:一是把结构化数据写入BigQuery对应表,二是把数据整理为你需要的格式(JSON/CSV等)作为附件或正文内容发送通知邮件。
调整后你可以直接下线Firestore层以及对应的BigQuery同步扩展,原本你统计的4份冗余里,Data Studio本身不存储数据仅做可视化渲染、邮件是业务需要的一次性通知副本,实际仅保留BigQuery一份核心业务存储,完全不会再出现不必要的存储浪费。
问题2:本业务场景下选用BigQuery作为存储更合适,还是应该使用Cloud SQL?
你的场景选BigQuery性价比更高,适配性更好:
- 你的核心需求是对接Data Studio搭建数据看板,BigQuery作为GCP原生数仓,和Data Studio的适配性、聚合查询性能都远优于Cloud SQL,后续如果设备扩容、数据量上涨,做看板查询的速度优势会更明显。
- 你当前月均仅1万条1KB的消息,全年新增存储量也不到120MB,BigQuery按实际存储量收费,长期存储还能自动享受折扣,成本极低。而Cloud SQL需要长期支付实例运行费用,哪怕存储量很小也有固定开销,对你的场景来说反而不划算。
除非你有高频的单条数据增删改查类的业务需求,否则没有必要切换为Cloud SQL。
问题3:BigQuery是否有类似Firestore的简易写入方式?
有,使用GCP官方提供的BigQuery客户端即可实现和Firestore写法复杂度接近的写入逻辑,Node.js环境示例代码如下:
const {BigQuery} = require('@google-cloud/bigquery'); const bigquery = new BigQuery(); // 写入BigQuery的调用方法 async function insertDataToBigQuery(name, age) { // 替换为你自己的数据集ID、表ID const datasetId = 'your_dataset_id'; const tableId = 'your_table_id'; const rows = [{ name: name, age: age }]; // 执行插入操作 await bigquery .dataset(datasetId) .table(tableId) .insert(rows) .then(() => { // console.log('写入成功'); return; }) .catch((err) => { console.error('写入失败:', err); return; }); }
你直接把该逻辑集成到监听Pub/Sub的Cloud Function中即可,不需要额外的复杂配置。
内容的提问来源于stack exchange,提问作者shab1r
相关产品推荐
相关产品推荐

