429(Too Many Requests)とは
HTTP 429 Too Many Requests レスポンスステータスコードは、ユーザーが指定された時間内に多くのリクエストを送信した ("rate limiting") ことを示します
Laravelではデフォルト1分間に60リクエスト
Laravelでは同一ドメインの同一IPアドレスからのAPIリクエストを
デフォルトで1分間に60回で制限されています。
app/Http/Kernel.php
で指定
protected $middlewareGroups = [
'api' => [
'throttle:60,1',
],
];
throttleの中身は?
Larvael標準のThrottleRequests
でアクセス制限が掛けられているのでここを確認しましょう。
先程と同じapp/Http/Kernel.php
で呼び出されていいるthrottle
のソースを追います。
protected $routeMiddleware = [
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
\Illuminate\Routing\Middleware\ThrottleRequests.php
でIPアドレスとドメインのハッシュを返却しています。
sha1()
が分からない方は↓
https://www.php.net/manual/ja/function.sha1.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回
ここらへんはシステムをどうしたいのかで自由に変更しちゃいましょう!
個人的にはよっぽどの事が無い限りデフォルトで使いたいですね!
protected $middlewareGroups = [
'api' => [
'throttle:60,1',
],
];
APIの送信自体を減らす考え方
例えばjsなどのクリックイベントでAPIが何度も送信されているケースがあれば
クリックイベント自体をn秒に1回までなどの制限を掛けてあげればいい。
一例
Lodashのdebounce
やthrottle
を使って
一定時間の連続の呼び出しを制限して負荷対策を行う。
https://qiita.com/waterada/items/986660d31bc107dbd91c