每秒处理 350k 个请求并将数据保存到 Google Cloud Storage
Posted
技术标签:
【中文标题】每秒处理 350k 个请求并将数据保存到 Google Cloud Storage【英文标题】:Process 350k requests per seconds and save data to Google Cloud Storage 【发布时间】:2020-09-19 23:50:21 【问题描述】:我需要实现在逻辑和架构方面相当简单的微服务,但需要每秒处理大约 305k 个请求。
它要做的就是提取 JSON 数据,根据简单的规则对其进行验证,然后以 JSON 文件的形式记录到 Google Cloud Storage。有很多可用的 Google Cloud 服务和 API,但我很难选择合适的堆栈和管道,因为我对它们以及高负载没有太多经验。
我正在看一个例子 https://cloud.google.com/pubsub/docs/pubsub-dataflow
流程如下:
PubSub > Dataflow > Cloud Storage
它完全符合我的需要(日期验证除外),但看起来 Dataflow 仅限于 Java 和 Python,我宁愿使用 php。
另一个相关的例子是 https://medium.com/google-cloud/cloud-run-using-pubsub-triggers-2db74fc4ac6d
它使用 Cloud Run,支持 PHP 和 PubSub 来触发 Cloud Run 工作负载。所以它是这样的:
PubSub > Cloud Run
在 Run 中使用 Cloud Storage 看起来非常简单。
我走对了吗?上面提到的东西可以为我工作还是我需要不同的东西?
【问题讨论】:
您想为每个请求创建 1 个文件还是将请求分组为消息(例如每分钟 1 个文件)?你的文件的目的是什么?之后你会怎么处理它们? 最好的选择是将消息分组到固定大小的间隔中(就像在第二个示例中发生的那样)。文件用作原始数据存储,以供稍后与 BigQuery 一起使用。但它现在不是必需的。现在它无力选择合适的服务。我们应该使用 App Engine 还是 Cloud Run 来监听请求 - 还是我们最好直接发布到 PubSub(以及接下来会发生什么,GAE、GCR).. 【参考方案1】:当我看到每秒 350k 的请求和 PubSub 时,我的第一个直觉是这种模式:
Pubsub > Dataflow > BigTable
我的问题验证了 BigTable 的选择,因为 you can query BigTable table from BigQuery 供以后分析。
当然,它很贵,但你有一个非常可扩展的系统。
如果您的 process fits the BigQuery streaming quotas, is to stream directly into BigQuery instead of BigTable.
Pubsub > Dataflow > BigQuery
Cloud Run 或 App Engine 解决方案的问题在于,您需要在外部运行一个流程(例如使用 Cloud Scheduler),并且在此流程中,您将执行一个循环以从 PubSub 订阅中提取消息。你将应对几个困难
PubSub 至少执行 1 次传递,可能会出现重复消息。数据流自动管理这个 App Engine 和 Cloud Run 的内存限制可能是个问题,尤其是在您的语言没有内存效率的情况下。 拉动速度可能是一个问题,并行性可能是一个挑战。 拉取持续时间限制为几分钟(由于 Cloud Run 和 App Engine 上的请求持续时间最长),您必须正常退出并等待下一个 Cloud Scheduler 触发器才能再次开始 PubSub 拉取。编辑
我忘记了你不想用 Java 或 Python 编写代码。如果您的流程非常简单,我可以为您提供 2 个替代方案:
使用Google provided Dataflow template,尤其是在流式传输中,您可以直接流式传输到 BigQuery,无需转换。如果你想执行转换,你可以使用the source code as base and just add your transform step in it. 您可以process your PubSub messages as a simple SQL query。设置起来很无聊,但您只需用 SQL 语言定义转换,然后为您构建数据流。个人意见:编码语言无所谓,为正确的工作使用正确的工具。为此使用 Cloud Run 或 App Engine 将创建一个比学习如何编写 10 行 Java 代码更不稳定且更难维护的系统
【讨论】:
感谢您的回答。数据流很好,但看起来它只支持 Java 和 Python。是否可以通过 PubSub 直接触发 App Engine 和/或 Cloud Run,从而摆脱 Cloud Scheduler 并通过消息循环? cloud.google.com/run/docs/triggering/pubsub-push 我用 2 Dataflow 低代码解决方案编辑了我的答案。我对不做标准东西的看法,我再次认为,不好的理由(语言)以上是关于每秒处理 350k 个请求并将数据保存到 Google Cloud Storage的主要内容,如果未能解决你的问题,请参考以下文章