0

Google 드라이브에서 내 계정과 공유하는 모든 이미지를 다운로드하기 위해 노드 스크립트 작업을하고 있습니다.Google 드라이브 API 호출 속도를 어떻게 제한합니까?

스택 오버플로 : Google Drive API file watch rate limits에 게시 된 다른 사람들과 마찬가지로 벽을 치고 있습니다.

지수 적 백 오프는 나에게 많은 의미가 있습니다. 구현 방법에 대해 알지 못합니다.

내가 얻을 수있는 통찰력은 엄청난 도움이 될 것입니다. 그냥 "시작하기 ..."라고해도 좋을 것입니다!

나는 아래에서 일하고있는 방법을 추가했습니다. 인증 및 모든 것이 정상적으로 작동하고 있습니다. 단지 userRateLimitExceeded 오류가 발생합니다.

모든 도움이 환상적이며 크게 감사하겠습니다.

감사합니다.

/** 
* Download all of the shared images. 
* 
* @param {google.auth.OAuth2} auth An authorized OAuth2 client. 
*/ 
function downloadImages(auth) { 
    const gDrive = google.drive({ 
    version: 'v3', 
    auth: auth 
    }); 

    gDrive.files.list({ 
    q: 'sharedWithMe = true and mimeType = "image/jpeg"' 
    }, (err, resp) => { 
    if(err) { 
     console.log('The API returned an error: ' + err); 
     return; 
    } 

    if(!resp.files.length) { 
     console.error('No files found.'); 
    } else { 
     // Remove existing images. 
     // removeImages(); 

     _.each(resp.files, (file) => { 
     if(fs.existsSync(IMAGE_DIR + file.name)) { 
      return; 
     } 

     gDrive.files.get({ 
      fileId: file.id 
     }) 
     .on('end',() => { 
      console.log(chalk.green(file.name + ' successfully downloaded.')); 
     }) 
     .on('error', (err) => { 
      console.log(err); 
     }) 
     .pipe(fs.createWriteStream(IMAGE_DIR + file.name)); 
     }); 
    } 
    }); 
} 

편집 : 나는 배치에 보였다,하지만 난 구글-API-nodejs 클라이언트가 일괄 처리를 지원하지 않는 것 같아요. 나는 "Batchelor"라고 불리는 써드 파티 라이브러리를 사용했다. 아직도 내 삶을 위해 일할 수 없습니다. :

+0

당신은 속도가 제한 받고,'gDrive.fkiles을 무엇. get()'do? 당신이 감지 할 수있는'.on ('error', ...)'이벤트 핸들러에 특정 에러를 얻었습니까? 그렇다면 어떤 구체적인 오류입니까? 기본적으로, 속도 제한이있을 때이를 감지하는 방법을 알 수 있도록 도와 주시면 해당 코드를 처리하는 데 도움을 드릴 수 있습니다. – jfriend00

+0

@ jfriend00 - 오류 처리기가있는 것처럼 보이지 않았습니다. 그것은 단지 "userRateLimitExceeded"또는 뭔가를 말하는 오류 객체와 함께 반환됩니다. 그리고 나는 그것이'console.error ('error', error)'와 같은 것을했을 경우 내 로그 레이블을 전혀 보지 않을 것이기 때문에 오류 처리기에 도달하지 못했다고 말합니다. : – Will

답변

1

JavaScript와 같은 비동기 언어의 경우 특히 간단하지 않습니다. 먼저 질문에 대한 답변에서 설명했듯이 지수 대기 백 오프를 수행하지 마십시오. API 호출 사이에 막대한 지연이 발생할 것입니다.

당신은 https://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts 이 그것은 내부 큐에 요청을 넣어 그것을 doees (403)를 포함 GDrives의 특이성을 처리하는 각도 (1 개) 서비스의 코드 주위에 포크를 가질 수있다, 나는 다음 항목을 취하는 프로세스를 처리량을 최대화하기 위해 대기열을 가변적으로 조정하지만 403 및 수 행자 재시도는 최소화하십시오.

일괄 처리는 더욱 악화되므로 d 그 길로 내려 가지 마라. 제한 요소 인 HTTP 요청 비율이 아니라 GDrive 내부 시스템에 대한 요청 비율입니다. 요청의 배치가 연속해서 G 드라이브로 발사됩니다, 운영 체제는이 documentation을 바탕으로 (403)가

+0

답장을 기쁘게 생각합니다. 불행히도 ngDrive의 간단한 예제를 로컬로 가져올 수 없습니다. "401. 오류입니다 : 오류 : invalid_client가 등록 된 원점이 없습니다."이것이 내가 포기하는 곳이라고 생각합니다. 이 아이디어 :/ – Will

+0

401은 단지 설정 항목입니다. API 콘솔에서 임상 ID를 만들거나 앱에서 구성하는 ID를 생성해야합니다. 3/앱에서 지정하는 승인 된 URL 중 하나에서 앱을 제공해야합니다. 1 단계 – pinoyyid

0

error 403 또는 당신이있어 userRateLimitExceeded 오류가 의미 트리거 할 가능성이 그 개발자 콘솔에서 사용자 별 제한 도달했습니다. 여기

Just take Note that the Drive API has a:

  • Courtesy daily quota 1,000,000,000 requests/day
  • Courtesy daily quota per second 100 requests/second
  • Per User Limit 10 requests/second/user

는 드라이브 API의 기본 할당량의 스크린 샷이다는

enter image description here

그래서 오류에 대한 제안 된 조치는 다음과 같습니다

  • 이있는 사용자 별 할당량을 올립니다 개발자 콘솔 프로젝트 한 사용자가 Google Apps 도메인의 많은 사용자를 대신하여 요청을 많이 만드는 경우

  • 을 (더 할당량 요청이 link를 사용), 권한 위임합니다 (quotaUser parameter 설정)와 Service Account을 고려하십시오.

  • exponential backoff을 사용하십시오.

자세한 내용은 다음 SO 질문을 확인하십시오

+0

"사용자 당 제한 10 개 요청/초/사용자"가 잘못되었습니다. 속도 조절이 그보다 복잡하고 공개적으로 문서화되지 않았습니다 – pinoyyid

+0

개발자 콘솔을 확인하면 User - 100s에 기본 할당량이 있음을 알 수 있습니다. 1,000이라는 값을 가지므로 사용자 당 최대 10 개의 요청 (초당 사용자 수)이 있음을 의미합니다. 제공하는 스크린 샷을 확인하십시오 . – KENdi

+0

많은 의미가 있습니다. 가장 많이 사용되는 제한 사항이 있습니다. 사람이 여행하는 것은 게시되지 않은 토큰/버킷 알고리즘에서 작동하는 속도 조절입니다. – pinoyyid