YouTube Data APIのクォータ設計:探すほうが書くより高い

この記事で分かること

YouTube Data APIには1日10,000ユニットというクォータ上限があります。この記事では、実際にコメント投稿を自動化して運用してみて分かった「検索のほうが投稿より高い」というコスト構造と、1日5件のコメント設計が実際に何ユニット消費するのか、そしてチャンネルを増やすときにクォータをどう分けているかを書きます。

クォータの単位は「リクエスト回数」ではない

YouTube Data APIのクォータは1日10,000ユニットです。ここで注意が必要なのは、この「ユニット」がリクエスト回数と一致しないことです。エンドポイントごとに消費するユニット数が違います。

search.list          100ユニット/回
commentThreads.insert 50ユニット/回
videos.list            1ユニット/回
channels.list          1ユニット/回

この表を初めて見たとき、私は順番が逆だと思いました。書き込み系のほうが重いはずだ、という思い込みがあったからです。実際には、動画を検索するsearch.listが100ユニットで、コメントを投稿するcommentThreads.insertの50ユニットの2倍です。

「何に返信するか探す」ほうが「実際に書く」より高い

これは設計に直接効いてきます。コメント自動投稿の処理は、大きく分けると次の2段階です。

  • どの動画にコメントするかを探す(search.list:100ユニット)
  • 実際にコメントを書き込む(commentThreads.insert:50ユニット)

つまり、コストの重心は「書く」ではなく「探す」側にあります。投稿件数を減らしてもクォータはあまり減らず、検索の呼び方を変えたほうが効きます。逆に言えば、一度の検索結果を使い回して複数件投稿する設計は、クォータの観点では素直に安くなります。

また、videos.listやchannels.listは1ユニットです。この差は100倍あります。動画IDが既に分かっているなら、search.listで探し直すのではなくvideos.listで取りに行く。これだけでコストが2桁変わるので、実装するときは「今この処理は探しているのか、既に知っているものを引いているのか」を意識するようにしています。

1日5件コメントする設計の実際の消費量

私が運用している構成は、1日5件コメントするというものです。計算するとこうなります。

検索  100 × 1回 = 100ユニット
投稿   50 × 5回 = 250ユニット
------------------------------
合計            350ユニット
(上限 10,000ユニット)

350ユニットです。上限10,000に対して余裕があります。この数字を出す前は、クォータが足りるかどうかが不安要素でしたが、実際に計算してみると心配していたレベルとは桁が違いました。

注意しておきたいのは、これはあくまで「検索1回・投稿5回」という設計の場合の数字だということです。検索の回数を増やせばここは一気に膨らみます。100ユニットの処理を1日に何十回も回す設計なら、投稿件数が同じでもクォータの話は別物になります。

チャンネルを増やすときはプロジェクトを分ける

クォータは Google Cloud プロジェクト単位で割り当てられます。そのため、チャンネルごとにGoogle Cloudプロジェクトを分けると、クォータも別々になります。

私は現在2チャンネルを、それぞれ別プロジェクトで運用しています。この構成にしておくと、片方のチャンネルで検索処理を増やしても、もう片方のクォータには影響しません。1プロジェクトにまとめて10,000ユニットを2チャンネルで奪い合う形にしなかったのは、そこが理由です。

ただし、この分け方が規模を増やしたときにどこまで通用するのかは、私はまだ確かめていません。2チャンネルで問題なく動いている、というところまでが実際に分かっていることです。

設計するときに見ている順番

  • まず、その処理は「探す」のか「既知のものを引く」のかを分ける
  • 探す(search.list)なら100ユニットなので、1日に何回呼ぶかを先に決める
  • 投稿(commentThreads.insert)は50ユニットなので、件数×50で見積もる
  • videos.list / channels.list は1ユニットなので、ここは基本的に気にしていない

クォータ設計というと難しそうに聞こえますが、実際にやっていることは「100の処理を1日何回呼ぶか決める」だけに近いです。1ユニットの処理をいくら呼んでも、100ユニットの検索1回のほうが重いからです。

まとめ

  • YouTube Data APIのクォータは1日10,000ユニット。エンドポイントごとに消費量が違う
  • search.listは100ユニット、commentThreads.insertは50ユニット。探すほうが書くより高い
  • videos.list / channels.list は1ユニット。既知のIDを引くだけなら検索の100分の1で済む
  • 1日5件コメントする設計なら、検索100 + 投稿250 = 350ユニット。上限には余裕がある
  • クォータの見積もりは、投稿件数より「検索を1日何回呼ぶか」で決まる
  • チャンネルごとにGoogle Cloudプロジェクトを分ければクォータも別々になる。実際に2チャンネルを別プロジェクトで運用中
  • ただし、この分け方がチャンネル数を増やしたときにどうなるかは、まだ確かめていない