0

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

2 回答 2

1

您是说即使您指定 timeoutMs=60000,它会在 1 秒内返回,但工作尚未完成?如果是这样,这是一个错误。

getQueryResults 的配额限制目前实际上远高于每秒 10 个请求。文档说只有 10 个的原因是因为我们希望能够在有人对我们打得太猛时将其限制到这个数量。如果您当前在此 API 上看到错误,则很可能您正在以非常高的速率调用它。

我将尝试重现我们不等待超时的问题……如果确实发生了这种情况,那可能是您问题的根源。

于 2013-07-03T18:02:11.490 回答
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
于 2013-07-07T08:33:51.303 回答