よろずやIT
プログラミング

APIをループで呼ぶ時の3つの約束|間隔・上限・再試行でアクセス制限を防ぐ

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

プログラミングのイラスト

「システム障害」に見えた、アクセス制限

以前、プログラムのループ処理で、外部のサービスのAPIに、大量のリクエストを一度に送ってしまい、サービス側からアクセスを制限されたことがありました。外から見ると、システムが突然止まったように見え、原因の切り分けに時間がかかりました。

ループでAPIを呼ぶことは、データを一括で取得する場面などで、よく行います。ただ、相手のサービスには、受け付けられる量に限りがあるため、何も考えずに繰り返すと、制限に引っかかります(用語の意味は、レートリミットとはで解説しています)。

なぜ、制限があるのか

サービス側は、すべての利用者に、安定して提供するために、一定の時間内に受け付ける量を、制限しています。1人が大量に使うと、他の利用者に影響が出るためです。

制限の例 内容
1秒あたりの回数 短い時間に、何回までか
1分・1日あたりの回数 一定期間の、合計の上限
同時に送れる数 並行して送れる、リクエストの数

具体的な上限は、サービスによって異なります。必ず、公式の説明で確認してください。

3つの約束

ループでAPIを呼ぶ時に、守りたい約束は、次の3つです。

① 間隔を空ける

リクエストの間に、待ち時間を入れます。連続して、続けざまに送らないようにします。

② 件数や並列数に、上限を設ける

一度に処理する件数や、同時に送る数に、上限を決めます。たとえば、「1回の実行で、最大100件まで」と制限します。

③ 失敗したら、間隔を延ばして、回数を決めて再試行する

エラーが返ってきたら、すぐに同じリクエストを繰り返さず、待ち時間を、少しずつ延ばしながら再試行します。そして、再試行の回数にも上限を設けます。永遠に繰り返さないためです。

サンプルコード(Python)

考え方を示す、簡単な例です。実際に使う前に、公式の仕様を確認し、小さなデータで試してください。

import time
import requests

URL = "https://api.example.com/items"   # 例のURLです
WAIT_SECONDS = 1.0     # ① リクエストの間隔
MAX_ITEMS = 100        # ② 1回の実行で処理する上限
MAX_RETRY = 3          # ③ 再試行の上限回数

def fetch(item_id):
    wait = 2.0
    for attempt in range(MAX_RETRY + 1):
        response = requests.get(f"{URL}/{item_id}", timeout=10)
        if response.status_code == 200:
            return response.json()
        if response.status_code == 429 and attempt < MAX_RETRY:
            time.sleep(wait)      # 失敗したら待つ
            wait *= 2             # 待ち時間を延ばす
            continue
        response.raise_for_status()
    return None

results = []
for item_id in range(1, MAX_ITEMS + 1):
    results.append(fetch(item_id))
    time.sleep(WAIT_SECONDS)      # ① 間隔を空ける

ポイントは、待ち時間・上限・再試行の回数を、はっきりした数値として、コードの先頭にまとめていることです。後から、公式の上限に合わせて、調整しやすくなります。

AIにコードを書いてもらう時の注意

「全件を取得するコードを書いて」と頼むと、間隔を空けず、連続でリクエストを送るループが、書かれることがあります。動くコードではありますが、相手のサービスの制限は、考慮されていません。

依頼する時に、条件を添えると、安全なコードが出やすくなります。

APIを使って、〇〇を全件取得するコードを書いてください。条件:①リクエストの間隔は1秒空ける ②1回の実行の上限は100件 ③エラーが返ったら、待ち時間を延ばしながら、最大3回まで再試行する ④APIキーは、コードに直接書かず、環境変数から読み込む

書かれたコードも、この条件が入っているかを、必ず確認してください(AIが書いたコードをそのまま使ってはいけない理由)。

制限を受けた時の切り分け

「突然、動かなくなった」と感じたら、次を確認します。

確認すること 内容
エラーの内容 ステータス(429など)と、メッセージ。待つ時間の指示が、含まれていないか
直前の動き 直前に、大量のリクエストを送っていないか
他の処理 同じAPIを使う、別の処理が、同時に動いていないか
公式の情報 上限や、仕様の変更がないか

トラブルの相談では、**「いつから」「何をした直後か」「今どんな状態か」**の3点が、重要です。特に、「大量に処理を実行した直後」から起きているなら、制限を疑います。連携が繋がらない時の、他の確認項目は、API連携が「両方正常なのに繋がらない」時の確認5項目で整理しています。

逆の立場:自分のサービスを、公開する時

APIを提供する側になる時も、同じ視点が重要です。制限を設けていないと、想定以上のアクセスが集中して、自分のサービスの負荷が上がり、他の利用者にも影響が出ます。

使う側と、提供する側、どちらの立場でも、「相手の受け入れられる量」を意識することが、安定した連携の土台です。

まとめ

APIの基本は、APIとは、APIキーの扱いは、APIキーとはをご覧ください。

関連記事:APIのタイムアウトとリトライの決め方、冪等キー(Idempotency-Key)とは

PR

APIを使った開発の入門書を探す

Amazonで見る
SHAREXLINEはてブ

よくある質問

Q.アクセス制限に、かかったかどうかは、どう分かりますか?

A.多くのサービスでは、制限を超えると、HTTPステータス「429」などのエラーを返します。また、返ってきた情報の中に、あと何秒待てばよいかの目安が含まれていることもあります。サービスの仕様は異なるため、公式の説明で、上限と、エラーの返し方を確認してください。

Q.待ち時間は、どのくらい入れればよいですか?

A.サービスごとに、1秒あたり・1分あたりの上限が決まっていることが多く、一律の正解はありません。まず、公式の説明で上限を確認し、その範囲に余裕を持たせた間隔を設定してください。迷う時は、控えめな間隔から始めて、様子を見ながら調整します。

Q.AIにコードを書いてもらう時の注意点はありますか?

A.AIが書いたループは、間隔を空けず、連続して呼び出すものになっていることがあります。依頼する時に、間隔・上限・再試行の条件を、あらかじめ指定してください。書かれたコードも、この3つが入っているかを、必ず確認してください。

関連記事

プログラミング用語解説

冪等性(べきとうせい)とは?二重決済を防ぐAPI設計の考え方

冪等性(べきとうせい)とは、同じ操作を何度行っても、結果が変わらない性質です。二重決済を防ぐAPI設計での考え方、冪等キー、HTTPメソッドとの関係、確認のチェックリストを解説します。

プログラミング手順・使い方

フレームワークは「流行っているから」で選ばない|小さく始めて移行する判断基準

流行っているからという理由でフレームワークを選ぶと、学習コストや過剰な機能で、かえって開発が遅くなることがあります。選定の失敗談と、規模・運用・撤退のしやすさで判断する基準、小さく始めて移行する進め方を整理します。

プログラミング用語解説

SQLインジェクション対策|プレースホルダ・エスケープの違いと限界

SQLインジェクションを防ぐ根本的な対策は、プレースホルダ(パラメータ化クエリ)です。エスケープや入力チェックとの違い、サニタイズの効果と限界、コード例、多層で守る考え方を解説します。

プログラミング用語解説

モノリシックとは?意味・メリット・マイクロサービスとの違い

「モノリシック」とは、1つの大きな塊で作るシステムの作り方です。マイクロサービスとの違い、それぞれのメリット・デメリット、選ぶ時の判断基準と、古いシステムを段階的に移行するストラングラーパターンまで、やさしく解説します。

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。