26
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-20

429(Too Many Requests)とは

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

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

26
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?