【发布时间】:2018-02-01 21:45:41
【问题描述】:
我使用的是 App Engine 标准环境(自动缩放),这意味着我有 10 分钟的时间限制取消请求。
目标是定期从 BigQuery 查询数据,并为每条记录在任务队列中创建一个任务,以便可以在后台处理记录。
https://cloud.google.com/bigquery/create-simple-app-api 状态的说明等待这样的工作:
// Create a job ID so that we can safely retry.
JobId jobId = JobId.of(UUID.randomUUID().toString());
Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
// Wait for the query to complete.
queryJob = queryJob.waitFor();
问题是 10 分钟的限制,因为 BigQuery 查询是在后台处理的,可能需要一些时间才能获得结果,所以我可能无法在同一个端点调用中处理响应。
- 有没有办法在查询准备就绪时从 URL 接收来自 BigQuery 的回调?
- 在 App Engine Standard 中是否有更智能的方式来处理来自 BigQuery 的数据?
我知道我可以配置 App Engine 以延长每个请求的最长时间,但这几乎不是解决方案。
【问题讨论】:
-
很遗憾,无法从 BigQuery 获得回电。你对查询/作业的结果做了什么?也就是说,您能否再解释一下为什么需要等待工作完成。
-
@GrahamPolley 我们的服务器将使用数据流式传输到 BigQuery(与电话通话分钟数相比),然后使用查询(例如按参与者)合并数据。我计划在任务队列中为每个这样的合并记录创建一个任务,以便进一步处理它。它与 Google 的 App Engine 计费系统非常相似,在该系统中,数据是从服务器收集、整合,然后在大约 5 分钟的时间间隔内决定给定资源是否可用。
-
因此,本质上您需要安排一些 BigQuery 作业/查询来处理一些数据,并将结果写入新表。对吗?
-
是的,这是正确的,到目前为止,这也有效(我已对聚合和重复数据删除进行了编码)。问题是需要在 App Engine 标准环境中进一步处理数据。我猜从表中提取数据并将记录标记为已提取不是一个好的选择。我错过了每次创建记录时都会调用 URL 的钩子或其他东西,因此 App Engine 可以逐条记录进一步处理数据。
-
不太清楚你所说的 10 分钟限制是什么意思。 GAE 请求处理程序有 only 60s 返回响应,否则返回 500。另一方面,Task Schedulers 有 10 分钟(如果您选择手动自动缩放)或长达 24 小时(基本和自动缩放)。这意味着您可以使用请求处理程序添加计划任务以在运行 BQ 查询的后台运行。
标签: google-app-engine google-bigquery