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



我们并行运行多个短查询,并达到10秒的限制。

根据文档,如果我们达到每个项目每个用户10个API请求的限制,可能会出现节流。我们发送了一个"开始查询作业",然后调用timeoutMs为60000的"getGueryResutls()",然而,我们在大约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

您是说即使指定timeoutMs=60000,它也会在1秒内返回,但作业尚未完成吗?如果是的话,这就是一个bug。

getQueryResults的配额限制目前实际上远高于每秒10个请求。医生们之所以说只有10个,是因为如果有人打得太重,我们希望有能力把它降到这个数字。如果您当前在这个API上看到一个错误,那么很可能您正在以非常高的速率调用它。

我将尝试重现我们不等待超时的问题。。。如果这真的发生了,那可能就是你问题的根源。

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

最新更新