簡體   English   中英

幾次請求后超出了用戶速率限制

[英]User rate limit exceeded after a few requests

我通過pydrive使用Google Drive API在兩個谷歌驅動器帳戶之間移動文件。 我一直在測試一個包含16個文件的文件夾。 我的代碼總是在第六個文件中引發錯誤

“超出用戶速率限制”>

我知道請求數量有限制(10 / s或1000 / 100s),但我已嘗試使用Google Drive API建議的指數退避來處理此錯誤。 即使在248秒之后,它仍然會引發同樣的錯誤。

這是我正在做的一個例子

def MoveToFolder(self,files,folder_id,drive):
    total_files = len(files)
    for cont in range(total_files):
        success = False
        n=0
        while not success:
            try:
                drive.auth.service.files().copy(fileId=files[cont]['id'],
                                                body={"parents": [{"kind": "drive#fileLink", "id": folder_id}]}).execute()
                time.sleep(random.randint(0,1000)/1000)
                success = True
            except:
                wait = (2**n) + (random.randint(0,1000)/1000)
                time.sleep(wait)
                success = False
                n += 1

我嘗試使用“批處理請求”來復制文件,但它會為10個文件引發相同的錯誤。

def MoveToFolderBatch(self,files,folder_id,drive):
    cont=0
    batch = drive.auth.service.new_batch_http_request()
    for file in files:
        cont+=1
        batch.add(drive.auth.service.files().copy(fileId=file['id'],
                                                 body={"parents": [
                                                     {"kind": "drive#fileLink", "id": folder_id}]}))
    batch.execute()

有人有任何提示嗎?

編輯:根據谷歌支持:

關於超出用戶速率限制錯誤,與控制台中設置的每用戶速率限制完全無關。 相反,它來自Drive API依賴的內部Google系統,並且最有可能在單個帳戶擁有域中的所有文件時發生。 我們不建議單個帳戶擁有所有文件,而是讓域中的個人用戶擁有這些文件。 要傳輸文件,您可以查看此鏈接。 另外,請檢查建議上的此鏈接以避免錯誤。

403:超出用戶速率限制基本上是防洪。

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "userRateLimitExceeded",
    "message": "User Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "User Rate Limit Exceeded"
 }
}

你需要放慢速度。 正如您所做的那樣實施指數退避是正確的行動方案。

谷歌在計算請求時並不完美,因此自己計算這些請求實際上並沒有幫助。 有時你可以在第二次獲得15次請求時,你只能獲得7次。

您還應該記住,如果服務器上有很多負載,您正在與使用服務器的其他人完成您的一個請求可能需要更長時間,而另一個可能不會。 不要在大多數人設置提取的cron作業的時候運行。

注意:如果您轉到google開發者控制台,您已啟用驅動器API到達配額選項卡,請單擊旁邊的鉛筆圖標

每個用戶每100秒查詢一次

查詢每100秒

你可以增加它們。 一個是基於用戶,另一個是基於項目。 每個用戶可以在100秒內發出X請求,您的項目可以每100秒發出Y請求。

在此輸入圖像描述

注意:不知道你可以設置多高。 這是我的開發帳戶,所以它可能有一些我無法記住的測試版訪問權限。

每秒僅插入一次后,請參閱403速率限制,插入時的 403速率限制有時會成功

關鍵點是: -

  • 退避但不實施指數退避! 這將簡化您的應用程序吞吐量

  • 相反,你需要主動限制你的請求,以避免304的發生。 在我的測試中,我發現最大可持續吞吐量是每1.5秒約1次交易。

  • 批處理會使問題變得更糟,因為批次在304被提升之前被解包。 IE瀏覽器。 一批10個被解釋為10個快速交易,而不是1個。

試試這個算法

delay=0                              // start with no backoff
while (haveFilesInUploadQueue) {
   sleep(delay)                      // backoff 
   upload(file)                      // try the upload
   if (403 Rate Limit) {             // if rejected with a rate limit
      delay += 2s                    // add 2s to delay to guarantee the next attempt will be OK
   } else {
      removeFileFromQueue(file)      // if not rejected, mark file as done
      if (delay > 0) {               // if we are currently backing off
         delay -= 0.2s               // reduce the backoff delay
      }
   }
}
// You can play with the 2s and 0.2s to optimise throughput. The key is to do all you can to avoid the 403's 

有一點需要注意的是,驅動器中存在(是?)錯誤,有時上傳會被403拒絕,但是,盡管發送了403,但驅動器繼續創建文件。 症狀將是重復的文件。 所以為了更加安全,在403之后你應該以某種方式檢查文件是否真的存在。 最簡單的方法是使用預先分配的ID,或者將自己的不透明ID添加到屬性中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM