Cindrella API (v1/v2) の利用規制が強化されました

2021-02-08

この記事は、デレマスボーダーbotのAPI「Cinderella API」を利用している開発者向けの記事です。デレマスボーダー bot の Web ポータルの利用者、あるいは Twitter (@imcgborder) の利用者にはあまり関係がありません。

なにが変わったのか(要約)

  • Cinderella API (v1/v2) は、短時間に多くのリクエストを行うと HTTP ステータスコード 429 [Too Many Requests] を返すという制限(仕様)が以前より存在します。この制限が 2021-02-08 から強化されました。以下、この 429 が返ることを「利用規制」と呼びます。
  • サーバにかける負荷が多い API ほど、利用規制が早くかかるようになりました。(具体的な利用規制に至る閾値は公開しません。負荷状況を見て動的に変更しています)
  • 判定はIP単位で行っています。(IPv6も判定しています)
  • 特に Cinderella API v1 は、 v2 より著しく早く利用規制されるようになりました。したがって、現在 Cindrella API v1 を利用しているサービスの開発者様におかれましては、早めに v2 への移行をご検討ください。

ここまでに至る経緯

Cinderella API は、アクセス先こそ Web ポータルと同一ですが、処理自体は Web ポータルとは分離していました。API 処理を専門に担当するサーバを準備し、処理していました。

↑変更前は Web サーバと API サーバは分離していました

昔は Web ポータルと API は同一サーバで処理していましたが、Cinderella API は道場サイト、Discord、フリトレ観測などで多数利用いただいており、平均 75,000 /日のリクエストがあります。バランサーで打ち返しているものは含んでいませんので、実際のリクエストはもっとあるでしょう。

このリクエストをWebポータルと同じサーバで処理すると、Web ポータルの表示が遅延するなど影響が出てしまうことから、ある程度アクセスが増えた時期より API 専用のサーバを立ち上げて分離していました。

しかしながら今般、運用費用の圧縮のため、 API 専用のサーバを閉塞し、Webポータルと同一のサーバで処理するように変更しました。(つまり昔の姿に戻しました)

↑変更後は Web サーバと API サーバは統合しました

統合したからといってサーバのスペックを引き上げたわけではないため、当然ながら、これまで受け止めていたすべてのリクエストをさばくことはできません。

Webポータルの表示を優先するため、また Cinderella API をなるべく多くの方に公平にご利用いただくために、従来は一律緩い制限としてきた API の利用規制を強化することになりました。

※余談:本当は Azure Functions (AWS の Lambda みたいなやつ)に移したら無料ないし低価格でできちゃうんじゃないかな~と思って試したのですが、実際やってみたらクラウド破産しそうなのでやめました。いちいちデータがでかいんだよこのアプリ…

主な変更点

  • 処理負荷に応じた API 利用規制を実装しました。
    • 道場 API のような負荷の低い API は緩い利用規制になっています。また、道場 API は大抵のアクセスは nginx のキャッシュで返しているため、そこまで影響はないと思います。(ただし道場 API v1 は後述の一律規制の影響を受けます)
    • 逆に、プロデューサー検索・プロダクション検索・フリートレード履歴検索などの高負荷の API は従来より厳しい利用規制がかかるようになりました。
    • イベントポイントなどは、検索レンジを広めにとった場合に早く利用規制がかかります。基準順位のみを取得する場合は利用規制が比較的緩くなっています。イベントポイントのレコードは7億件あるため、データへの触り方によっては負荷が大きいのです。
    • 特に、検索結果のサイズ(JSONの出力件数)が大きいほど早く利用規制がかかります。
  • Cinderella API v1 は、v2 に比べて最適化が進んでおらず、内部負荷が高いことから、 v2 より早く利用規制がかかるようになりました。
  • Web ポータル側の負荷が高い場合、これまでの API への個別のアクセス状況に関わらず、すべての Cinderella API の利用が一律規制されるようになりました。この場合、 v1 から先に規制されます。
  • 異常な API への高頻度アクセスを行うユーザを IP 単位で時限的に自動拒否するようになりました。
    • 「同じプロダクションの明細情報を毎分取得し続けてもしょうがないでしょ?? 更新されるタイミングはイベント終了時ぞ??」というようなアクセスがあるので…
  • 利用規制された場合は、一定時間が経過すると再度利用できるようになります。また、すべてのAPIが利用できなくなるわけではなく、異なる種類のAPIは利用できます。

なお、現時点では Cinderella API のみの利用規制になっていますが、今後の状況によっては Web ポータルにも導入します。といいますか、すでに緩めの利用規制は Web ポータルにも入っています。

おわりに

利用者の方々には急な変更にはなってしまい恐縮です。

限られたリソースのなかで、なるべく多くの方にすべてのサービスを公平に利用していただけるようにしたいと考えています。ご理解をお願いします。