YouTube Data API v3を利用したプレイリストのエクスポート/インポート機能のクォータ使用量

Googleは、APIによる各リクエストにコストを割り当ててクォータの使用量を計算している。コストは操作の種類ごとに下記のように設定されている。

※追記:Googleがクォータ・コストの割り当て方法の簡略化を行い、part パラメータに伴う追加コストが撤廃された。
https://developers.google.com/youtube/v3/revision_history#july-29,-2020

簡略化後は、part引数によらず、単純に各メソッドに割り当てられたコストがかかるだけになる。


※注意:これ以降の内容は、以前のpartパラメータにかかる追加コストを考慮に入れて、コストを計算したもの
  • リソースのIDを取得するだけの単純な読み取り操作のコストは 1 ユニット
  • リソースのパーツ(snippetstatus など、ただし id は除く)を取得する読み取り操作のコストはパーツ毎に 2 ユニット
  • リソースの書き込み操作のコストは 50 ユニット
  • 動画のアップロードのコストは 1600 ユニット

ここで、下記のプレイリストのエクスポート機能を想定したAPIリクエストのコストを計算してみる。

$youtube->playlistItems->listPlaylistItems('snippet', $params)

※フィルタのパラメータ $paramsmaxResults の値に 50 を設定、1回のリクエストで最大50件のプレイリストアイテム(プレイリスト内の動画情報)を取得

読み取り操作には、1 ユニットのコストがかかる。引数 partsnippet だけ指定しているので、読み取るパーツ数は1となる。パーツの読み取り操作は、パーツ毎に 2 ユニットなので、読み取り操作全体のコストは、

1 + 2 * 1
= 3

となり、上記APIリクエストは1回で 3 ユニットのコストがかかることになる。

1日あたりのクォータが 10,000、含まれる動画が50個以内のプレイリストを対象にすると、1日あたり 3,333 (=10,000/3) のプレイリスト情報を取得できる計算になる。


次に、下記のプレイリストのインポート機能を想定したAPIリクエストのコストを計算してみる。

プレイリストのインポートでは、下記2つのAPIリクエストが行われる。

  1. $youtube->playlists->insert('snippet,status', $youTubePlaylist, [])
  2. $youtube->playlistItems->insert('snippet', $playlistItem, [])

まず1番目のリクエストのコストから。

これはプレイリストを作成するためのもので、書き込み操作に該当する。よって、playlists->insert() は、書き込み操作として 50 ユニットのコストがかかる。

また、playlists->insert() の書き込み操作は、書き込みだけでなく、APIレスポンスとしてリソースを返す処理も実行される。つまり、リソースを返す処理に伴い読み取り操作のコストもかかることになる。読み取り操作には、1 ユニットのコストがかかる。引数 partsnippet,status を指定しているので、読み取るパーツ数は2となる。よって、playlists->insert() は、読み取り操作として、

1 + 2 * 2
= 5

のコストがかかる。

よって、playlists->insert() にかかる書き込みと読み取り操作のコストを合わせると、

50 + 5
= 55

これが1番目のAPIリクエストのコストとなる。

続いて、2番目のリクエストのコストを計算してみる。

これは作成したプレイリストにプレイリストアイテムを追加していく操作で、書き込み操作として、playlistItems->insert()50 ユニットのコストがかかる。これも同様にAPIレスポンスを返す処理に伴い読み取り操作が行われる。引数 partsnippet を指定しているので、読み取るパーツ数は1となることから、playlistItems->insert() は、読み取り操作として、

1 + 2 * 1
= 3

のコストがかかる。playlistItems->insert() にかかる書き込みと読み取り操作のコストを合わせると、

50 + 3
= 53

のコストがかかることになる。これはプレイリストアイテム1個あたりにかかるコストとなる。

そこで、プレイリストに15個のプレイリストアイテムを追加する場合を想定すると、

53 * 15
= 795

これが2番目のAPIリクエストのコストとなる。

プレイリストの作成、プレイリストアイテムの追加(15個)のコストを合わせると

55 + 795
= 850

これが1番目と2番目のAPIリクエストを合わせた総コストとなる。

1日あたりのクォータが 10,000、含まれる動画が10個のプレイリストをインポート対象とすると、1日あたり 11 (=10,000/850) のプレイリストをインポートできる計算になる。


エクスポートとインポートのコストを比較してみると、1日あたりの可能なエクスポート数は 3,333、インポート数は 11 となることから、書き込み操作のコストはかなり高いことがわかる。

クォータの使用量は、Google Cloud Platformの "IAM と管理" → "割り当て" から確認できる。

最後に、クォータ制限に引っかかると下記のようなエラーが返ってくる。これはプレイリスト作成で playlists->insert() による書き込み操作をリクエストしたときのもの。
※クォータ上限は 10,000 のはずなのだが、7700 ぐらいに達したぐらいで書き込み操作を伴うAPIリクエストが一切行えなくなった

Fatal error: Uncaught Google_Service_Exception: {
  "error": {
    "code": 500,
    "message": "Internal error encountered.",
    "errors": [
      {
        "domain": "youtube.api.v3.PlaylistInsertResponse.Error",
        "reason": "RATE_LIMIT_EXCEEDED"
      }
    ],
    "status": "INTERNAL"
  }
}