2013-07-03 25 views
0

我們並行運行多個短查詢,並達到10秒的限制。如何避免碰到每位用戶10秒的限制

根據文檔,如果我們達到每個項目每個用戶10個API請求的限制,則可能會發生調節。 我們發送一個「開始查詢作業」,然後我們調用帶有60,000 timeoutMs的「getGueryResutls()」,然而,我們在〜1秒後得到一個響應,我們在JSON響應中查找JOB Complete,並且因爲它是不在那裏,我們需要再次發送GetQueryResults()多次並達到閾值,這是造成錯誤,而不是減速。示例代碼如下。

我們的問題是這樣的: 1.什麼是「用戶」,它是一個appengine用戶,它是一個用戶ID,我們可以放入連接字符串或查詢itslef? 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 

回答

1

你是說,即使你指定timeoutMs = 60000,它在1秒之內返回,但這項工作尚未完成?如果是這樣,這是一個錯誤。

getQueryResults的配額限制實際上目前遠高於每秒10個請求。文檔只說10的原因是因爲如果有人打我們太辛苦,我們希望有能力將其降低到這個數量。如果您目前在此API上看到錯誤,則可能是您以非常高的速度調用它。

我會嘗試重現問題,我們不會等待超時...如果這確實是發生了什麼,它可能是您的問題的根源。

+0

thanks.if它的工作原理是一樣,那也不錯。 但是,是的,我們得到的響應沒有完成任務非常快,需要重新查詢。 此外,如果這是限制,我們如何得到錯誤超出率限制:這個user_method的用戶/方法api請求限制太多? 如果你可以複製,會很好。 – user1516770

+0

我已經添加了更詳細的測試,請參閱我的下一條評論 – Shay

+0

您能否驗證您的工作沒有出現錯誤?當你等待時你能打印出整個結果嗎?當出現錯誤時,您不會完成作業,您將只返回一個不同的http響應代碼和一個「錯誤」對象作爲結果)。 –

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