Почему запросы задерживаются дольше, чем указано в промежуточном программном обеспечении? - PullRequest
1 голос
/ 18 марта 2020

Мои маршруты объявлены так:

Route::group(['prefix' => 'media', 'middleware' => 'auth'], function() {
    Route::group(['middleware' => 'throttle:120,1'], function() {
        Route::get('/', 'MediaController@index'); // <-- Route in question
        Route::delete('/{id}', 'MediaController@delete');
        Route::patch('/{id}', 'MediaController@edit');
    });
    Route::post('/', 'MediaController@upload')->middleware('throttle:100,1440');
});

Если я правильно понимаю промежуточное программное обеспечение регулирования, когда пользователь достигает ограничения скорости (120 запросов в 1 минуту), он должен регулироваться в течение оставшегося времени 1-минутный период, а затем разблокируется.

Однако время блокировки превышает 1 минуту. См. retry-after header: Returned retry-after header value is 180

(Когда я впервые это заметил, прошло более 600 секунд, поэтому не всегда 180 секунд)

Есть идеи, почему это будет выше, чем 1 минута?

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Я понял!

Оказывается, стандартное поведение промежуточного программного обеспечения throttle не работает на маршруте. Он просто регулирует количество запросов на каждого зарегистрированного пользователя. И, как вы можете видеть, у меня был один маршрут (один загружаемый), который имеет throttle:100,1440, и это вызывало проблемы, приводящие к гораздо более длительным «наказаниям» даже для маршрутов с throttle:120,1.

Мое решение: Я написал собственную версию промежуточного программного обеспечения ThrottleRequests.php, работающего на маршруте:

  1. Поместите этот файл в Ваша папка app/Http/Middleware.
  2. В app/Http/Kernel.php измените промежуточное программное обеспечение маршрута газа на новое:
'throttle' => \App\Http\Middleware\ThrottleRequestsPerRoute::class,
Теперь, когда вы назначаете промежуточное ПО throttle, оно будет работать для каждого маршрута.

Другое решение: Вы также можете использовать промежуточное ПО по умолчанию и использовать третий параметр. , Вы можете передать префиксный параметр следующим образом: throttle:100,1440,upload. Он назначит префикс загрузки для регулирующего ключа и ограничит количество запросов, основываясь на этом. Однако для достижения ограничения скорости на каждый маршрут вам придется назначать разные префиксы для каждого маршрута.

0 голосов
/ 18 марта 2020

Заголовок retry-after не имеет ничего общего с ограничением скорости. Все заголовки, связанные с ограничением скорости, имеют префикс x-ratelimit-. Заголовок x-ratelimit-reset - это то, что вы ищете: отметка времени, когда предел будет сброшен. Это должно быть в течение следующей минуты (или любого периода, который вы установили)

...