Help us understand the problem. What is going on with this article?

Laravelで429 (Too Many Requests)が出た時の対策

429(Too Many Requests)とは

HTTP 429 Too Many Requests レスポンスステータスコードは、ユーザーが指定された時間内に多くのリクエストを送信した ("rate limiting") ことを示します

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/429

Laravelではデフォルト1分間に60リクエスト

Laravelでは同一ドメインの同一IPアドレスからのAPIリクエストを
デフォルトで1分間に60回で制限されています。

app/Http/Kernel.phpで指定

Kernel.php
protected $middlewareGroups = [
    'api' => [
        'throttle:60,1',
    ],
];

throttleの中身は?

Larvael標準のThrottleRequestsでアクセス制限が掛けられているのでここを確認しましょう。

先程と同じapp/Http/Kernel.phpで呼び出されていいるthrottleのソースを追います。

Kernel.php
protected $routeMiddleware = [
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

\Illuminate\Routing\Middleware\ThrottleRequests.php
IPアドレスドメインのハッシュを返却しています。

sha1()が分からない方は↓
https://www.php.net/manual/ja/function.sha1.php

ThrottleRequests.php
public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1)
{
    $key = $this->resolveRequestSignature($request);
    // 色々書かれているけど省略
}

/**
 * Resolve request signature.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return string
 * @throws \RuntimeException
 */
protected function resolveRequestSignature($request)
{
    if ($user = $request->user()) {
        return sha1($user->getAuthIdentifier());
    }

    if ($route = $request->route()) {
        return sha1($route->getDomain().'|'.$request->ip());
    }

    throw new RuntimeException(
        'Unable to generate the request signature. Route unavailable.'
    );
}

すみません。
色々ソースを追う予定でしたが後ほど更新します。

429を出さないようにするには?

Larvaelのデフォルトの制限を緩めて上げましょう。

throttle:60,1が1分で60回なので
throttle:600,10に書き換えれば10分で600回

ここらへんはシステムをどうしたいのかで自由に変更しちゃいましょう!
個人的にはよっぽどの事が無い限りデフォルトで使いたいですね!

Kernel.php
protected $middlewareGroups = [
    'api' => [
        'throttle:60,1',
    ],
];

APIの送信自体を減らす考え方

例えばjsなどのクリックイベントでAPIが何度も送信されているケースがあれば
クリックイベント自体をn秒に1回までなどの制限を掛けてあげればいい。

一例

Lodashのdebouncethrottleを使って
一定時間の連続の呼び出しを制限して負荷対策を行う。
https://qiita.com/waterada/items/986660d31bc107dbd91c

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away