处理 10req/s 并保存到云存储 - 推荐方法?

Process 10req/s and save to cloud storage - recommended method?

我每秒有 10 个数据请求要保存,如下所示。 CloudRun 函数完成后,我需要保存此数据。 (我的基础架构在 google-cloud-platform 上)。数据将用作机器学习的数据集。

{ 
  "text": "1k characters", 
  "text2": "1k characters", 
  "metadata1": "enum (100 vals)", 
  "metadata2": "number value" 
}

我计划将其作为一个未等待的函数保存到 google-cloud-storage 在一个文件夹中 在基于 metadata1 enum 的文件夹中。哪一个比另一个好?

这条路合适吗?

我认为

中建议的 pubsub 有点矫枉过正

我可以向你推荐两种模式,但在这两种情况下你都需要存储消息:

  • 要么使用 PubSub 来堆叠消息。然后,使用 Dataflow 读取 pubsub 并下沉到 Cloud Storage。或者使用按需服务(例如 Cloud 运行)来拉取您的 PubSub 订阅并写入一个包含所有已读取消息的文件(您可以使用 Cloud Scheduler 触发您的 Cloud 运行,例如每小时一次)
  • 或者将消息存储在 BigQuery 中,然后定期执行查询导出到 GCS(同样使用 Cloud Scheduler + Cloud Functions/Run)。这是我的首选解决方案,因为也许有一天,您将不得不以不同的方式处理您的消息,并对它们进行 metrics/perform 分析。

@guillaume 的回答绝对是最好的,但为了便于实施,我决定直接将它们保存到 GCS。

const saveData = async ({ text, text2, enum, number }) => {
  try {
      const timestamp = new Date().getTime()
      const folder = enum
      const fileName = `${folder}/${enum}-${timestamp}.json`
      const file = bucket.file(fileName)
      const contents = JSON.stringify({ text, text2, enum, number })
      return file.save(contents)
    }
  } catch (e) {
    console.log(`Failed to save file, ${e.message}`)
  }
}

它增加了一些延迟,但总体而言,与 pubsub 方法相比,我估计每月服务器成本约为 10 美元,在尝试确定成本时,每月大约 50-100 美元(或更多) , 很难确定。但它确实假定每条消息在 1MB 以下时为 1MB)。

Guillaume 提供的大查询方法 appeared to have no cost 因为每月 1TB 的传输数据是免费的。在这一点上我可能是错的。稍后我可能会切换到这个。