如何避免达到每个用户10秒的限制

时间:2013-07-03 07:22:03

标签: google-bigquery

我们并行运行多个短查询,并达到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

2 个答案:

答案 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