我们并行运行多个短查询,并达到10秒的限制。
根据文档,如果我们为每个项目的每个用户达到10个API请求的限制,则可能会发生限制。 我们发送一个“启动查询作业”,然后我们调用“getGueryResutls()”,其timeoutMs为60,000,但是,我们在~1秒后得到响应,我们在JSON响应中查找JOB Complete,因为它不是在那里,我们需要多次发送GetQueryResults()并达到阈值,这会导致错误,而不是减速。示例代码如下。
我们的问题是这样的:
1.什么是“用户”是一个appengine用户,它是一个用户ID,我们可以放在连接字符串或查询其中吗?
2.它是否真的符合BigQuery的API项目?
3.什么是行为?我们得到一个错误:“超出速率限制:此user_method的用户/方法api请求限制太多”,而不是文档所说的所有进程失败的限制行为。
4.如下面的代码所示,为什么我们在1秒后得到响应&不是根据我们的超时?我们做错了吗?
非常感谢
以下是示例代码:
while (res is None or 'jobComplete' not in res or not res['jobComplete']) :
try:
res = self.service.jobs().getQueryResults(projectId=self.project_id,
jobId=jobId, timeoutMs=60000, maxResults=maxResults).execute()
except HTTPException:
if independent:
raise
答案 0 :(得分:1)
您是说即使您指定timeoutMs = 60000,它会在1秒内返回,但作业尚未完成?如果是这样,这是一个错误。
getQueryResults的配额限制实际上目前远高于每秒10个请求。文档说只有10的原因是因为我们希望有能力将其降低到那个数量,如果有人打得太厉害了。如果您目前在此API上看到错误,则可能是您以非常高的速率调用它。
我会尝试重现我们不等待超时的问题......如果真的发生了什么事情,它可能是你问题的根源。
答案 1 :(得分:0)
def query_results_long(self, jobId, maxResults, res=None):
start_time = query_time = None
while res is None or 'jobComplete' not in res or not res['jobComplete']:
if start_time:
logging.info('requested for query results ended after %s', query_time)
time.sleep(2)
start_time = datetime.now()
res = self.service.jobs().getQueryResults(projectId=self.project_id,
jobId=jobId, timeoutMs=60000, maxResults=maxResults).execute()
query_time = datetime.now() - start_time
return res
然后在appengine日志中我有这个:
requested for query results ended after 0:00:04.959110