Ограничение частоты запросов API в Yii 2
Ограничение частоты запросов API в Yii 2

Ограничение частоты запросов

Чтобы избежать злоупотреблений, вам следует подумать о добавлении ограничения частоты запросов к вашим API. Например, вы можете ограничить использование API до 100 вызовов в течение 10 минут для каждого пользователя. Если от пользователя в течение этого периода времени приходит большее количество запросов, будет возвращаться ответ с кодом состояния 429 («слишком много запросов»).

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



Чтобы включить ограничение частоты запросов, [[yii\web\User::identityClass|класс user identity]] должен реализовывать интерфейс [[yii\filters\RateLimitInterface]]. Этот интерфейс требует реализации следующих трех методов:

  • getRateLimit(): возвращает максимальное количество разрешенных запросов и период времени, например [100, 600], что означает не более 100 вызовов API в течение 600 секунд.
  • loadAllowance(): возвращает оставшееся количество разрешенных запросов и UNIX-timestamp последней проверки ограничения.
  • saveAllowance(): сохраняет оставшееся количество разрешенных запросов и текущий UNIX-timestamp.

Вы можете использовать два столбца в таблице user для хранения количества разрешённых запросов и времени последней проверки. В методах loadAllowance() и saveAllowance() можно реализовать чтение и сохранение значений этих столбцов в соответствии с данными текущего аутентифицированного пользователя. Для улучшения производительности можно попробовать хранить эту информацию в кэше или NoSQL хранилище.

Реализация в модели User может быть, например, такой:

public function getRateLimit($request, $action)
{
    return [$this->rateLimit, 1]; // $rateLimit запросов в секунду
}

public function loadAllowance($request, $action)
{
    return [$this->allowance, $this->allowance_updated_at];
}

public function saveAllowance($request, $action, $allowance, $timestamp)
{
    $this->allowance = $allowance;
    $this->allowance_updated_at = $timestamp;
    $this->save();
}

Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения частоты запросов при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышении ограничений будет выброшено исключение [[yii\web\TooManyRequestsHttpException]].

Вы можете настроить ограничитель частоты запросов в ваших классах REST-контроллеров следующим образом:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
    return $behaviors;
}

При включенном ограничении частоты запросов каждый ответ, по умолчанию, возвращается со следующими HTTP-заголовками, содержащими информацию о текущих ограничениях:

  • X-Rate-Limit-Limit: максимальное количество запросов, разрешённое в течение периода времени;
  • X-Rate-Limit-Remaining: оставшееся количество разрешённых запросов в текущем периоде времени;
  • X-Rate-Limit-Reset: количество секунд, которое нужно подождать до получения максимального количества разрешённых запросов.

Вы можете отключить эти заголовки, установив свойство [[yii\filters\RateLimiter::enableRateLimitHeaders]] в false, как показано в примере кода выше.

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню