Что вы должны знать о ограничении скорости

Все, что вам нужно знать об ограничении скорости

Ограничение скорости – это концепция контроля количества трафика, отправляемого к ресурсу. Как можно достичь такого контроля? С помощью ограничителя скорости – компонента, позволяющего контролировать скорость сетевого трафика к серверу API или любому другому приложению, которое вы хотите защитить.

Вот грубая схема, как ограничитель скорости вписывается в контекст системы.

Например, если клиент отправляет 3 запроса серверу, а сервер может обработать только 2 запроса, вы можете использовать ограничитель скорости, чтобы ограничить дополнительный запрос и не допустить его до сервера.

Потребность в ограничении скорости

Некоторые весомые причины включить ограничение скорости в вашей системе следующие:

  • Предотвращение злоупотребления системой злонамеренными акторами, пытающимися овервелмить ваши серверы необычно большим количеством запросов.
  • Позволяет разрешить только трафик, который ваши серверы могут обработать в данный момент времени.
  • Ограничение потребления некоторых дорогостоящих ресурсов из внешней системы.
  • Предотвращение каскадных сбоев в системах нижнего уровня, когда система верхнего уровня сбивается с толку большим количеством запросов.

Основные концепции ограничения скорости

В каждой настройке ограничения скорости есть 3 основные концепции. Независимо от выбранного алгоритма ограничения скорости, эти 3 концепции играют свою роль.

Вот краткий обзор каждой из них.

  1. Ограничение — определяет максимальное количество запросов, разрешенных системой в определенный промежуток времени. Например, Twitter (теперь X) недавно ограничил непроверенных пользователей просмотром только 600 твитов в день.
  2. Промежуток времени—Это время для ограничения. Это может быть секунды, минуты или даже дни.
  3. Идентификатор—Это уникальный атрибут, который позволяет отличить между индивидуальными владельцами запросов. Например, идентификатором может быть ID пользователя или IP-адрес.

Проектирование системы с ограничением скорости

Основная идея ограничителя скорости довольно проста. На высоком уровне, вы подсчитываете количество запросов, отправленных определенным пользователем, IP-адресом или из географического местоположения. Если количество превышает допустимое ограничение, вы отклоняете запрос.

Тем не менее, за кадром есть несколько вещей, о которых нужно подумать при проектировании ограничителя скорости. Например:

  • Где вы должны хранить счетчики?
  • Как насчет правил ограничения скорости?
  • Как ответить на запрещенные запросы?
  • Как убедиться, что изменения в правилах применяются?
  • Как гарантировать, что ограничение скорости не снижает общую производительность приложения?

Для сбалансированного учета всех этих факторов, вам нужно несколько компонентов, работающих в сочетании. Вот иллюстрация, показывающая такую ​​систему.

Давайте разберемся, что здесь происходит:

  • Когда запрос приходит на сервер API, он сначала попадает в компонент ограничителя скорости. Ограничитель скорости проверяет правила в движке правил.
  • Ограничитель скорости проверяет данные об ограничении скорости, хранимые в кэше. Эти данные в основном сообщают, сколько запросов уже обслужено для определенного пользователя или IP-адреса. Использование кэша позволяет достичь высокой пропускной способности.
  • Если запрос находится в допустимом пороге, ограничитель скорости разрешает его и отправляет на сервер API.
  • Если запрос превышает лимит, ограничитель скорости запрещает запрос и сообщает клиенту или пользователю, что они были ограничены по скорости. Обычным способом является возврат HTTP-кода состояния 429 (слишком много запросов).

Возможные улучшения

Теперь у вас есть несколько вариантов улучшения:

  • Вместо того, чтобы возвращать HTTP-код состояния 429, вы также можете просто игнорировать запрос молча. Это полезный прием, чтобы обмануть злоумышленника и сделать ему вид, что запрос был принят, хотя ограничитель скорости на самом деле полностью отклонил запрос.
  • Кроме того, вы также можете использовать кэш перед движком правил, чтобы увеличить производительность. В случае обновления правил у вас может быть фоновый рабочий процесс, обновляющий кэш с последним набором правил.

Алгоритмы ограничения скорости

Хотя каждый алгоритм требует подробного обсуждения, здесь мы кратко рассмотрим наиболее популярные.

Фиксированное окно счетчика

Это, вероятно, самый простой алгоритм ограничения скорости. В этом алгоритме мы делим время на фиксированные интервалы времени. Для каждого окна мы поддерживаем счетчик. Каждый входящий запрос увеличивает счетчик на единицу, и когда счетчик достигает максимального значения, все последующие запросы отбрасываются до начала нового окна времени.

Хотя этот алгоритм является простым и понятным, у него есть большая проблема. Всплеск трафика на границах временного окна может привести к огромному количеству запросов, которые проходят через короткий промежуток времени и перегружают сервер.

Если вас интересует, ознакомьтесь с моей статьей об основной реализации алгоритма фиксированного окна ограничения скорости.

Лог сдвигающегося окна

Лог сдвигающегося окна решает проблему с алгоритмом фиксированного окна. Вместо фиксированного временного окна он использует сдвигающееся временное окно.

Для каждого запроса алгоритм отслеживает временную метку запроса в кэше. Когда приходит новый запрос, алгоритм удаляет все устаревшие временные метки, которые старше начала текущего временного окна. Если размер лога находится в пределах допустимого ограничения, запрос принимается. В противном случае он отклоняется.

<p, p="" алгоритм="" большого="" временные="" все="" вы="" должны="" количества="" конечно,="" метки.

Сдвигающийся счетчик окна

Сдвигающийся счетчик окна объединяет лучшее из фиксированного и сдвигающегося окна.

Вместо хранения временных меток этот алгоритм поддерживает счетчик для сдвигающегося окна. Чтобы определить, принять или отклонить новый запрос, он вычисляет сумму запросов в текущем окне и добавляет ее к приближению количества запросов в предыдущем окне. Приближение количества запросов в предыдущем окне вычисляется путем умножения общего числа запросов в предыдущем окне на процент перекрытия сдвигающегося окна.

Преимущество этого алгоритма заключается в том, что он сглаживает пики трафика и эффективно использует память. Однако он не вычисляет точное количество запросов, а работает с приближением.

Алгоритм токенов

Алгоритм токенов довольно популярен для ограничения скорости.

В этом алгоритме мы создаем ведро с токенами заранее заданной вместимости. Токены помещаются в ведро с заданной скоростью. Когда ведро заполняется, больше токенов не добавляется. Каждый новый запрос потребляет один токен. Если в ведре нет доступных токенов, ограничитель скорости отбрасывает запрос.

Преимущество такого подхода в том, что он позволяет бурстам трафика пройти в течение коротких периодов времени.

Основная сложность заключается в настройке сочетания размера ведра и скорости пополнения токенов.

Алгоритм утечки

Алгоритм утечки довольно похож на алгоритм с токенами. Единственное отличие состоит в том, что запросы обрабатываются с фиксированной скоростью.

Он реализован с использованием подхода FIFO. Когда приходит запрос, система проверяет, полный ли очередь. Если нет, запрос добавляется в очередь, в противном случае он отбрасывается.

Запросы в очереди обрабатываются с фиксированной скоростью, чтобы избежать перегрузки сервера.

Варианты использования ограничителя скорости

В то время как может показаться легким думать об ограничителе скорости как о защите вашей системы от внешних запросов, он также может помочь вам внутренне.

Прежде чем закончить это введение, давайте рассмотрим некоторые из важных вариантов использования ограничителя скорости, включая как внешние, так и внутренние варианты использования.

  • Предотвращение катастрофических DDoS-атак — Это делается путем определения злонамеренных IP-адресов, пользователей или токенов запросов, которые пытаются перегрузить систему. Запросы отбрасываются в зависимости от алгоритма.
  • Грациозная обработка всплеска пользователей — Не весь трафик является вредоносным, и иногда ваш сайт может привлечь всплеск законного трафика. Однако, если у вас нет возможности обработать увеличение трафика, лучше обработать это грациозно, чем представить пользователям экран с ошибкой.
  • Многоуровневая ценообразования — Это внутренний вариант использования, когда вы можете предлагать различные уровни использования пользователям, принадлежащим к разным отраслям. Это типичное требование для многих платных услуг SaaS по запросу.
  • Неисчерпание/слишком интенсивное использование сторонней системы — Это еще один внутренний вариант использования, когда вам может потребоваться ограничить количество вызовов API, которые вы делаете к дорогостоящему стороннему API (например, глубокой модели машинного обучения). Вы можете использовать ограничение скорости, чтобы ограничить количество вызовов.
  • Защита незащищенной системы — Иногда мы можем хотеть быть осторожными с несекьюризированной системой. Например, если вы собираетесь жестко удалить миллион записей из базы данных, вы рискуете сбить базу данных, если выполните операцию сразу. Вы можете использовать алгоритм ограничения скорости, чтобы равномерно распределить удаления.

Заключение

Ограничение скорости – это важный инструмент для создания систем с высоким уровнем доступности. В этом посте мы рассмотрели только общую картину ландшафта ограничения скорости и причины, по которым нам это нужно. У каждого из алгоритмов, упомянутых в этом посте, есть свое собственное теоретическое обоснование и практические соображения.

Если у вас есть какие-либо вопросы или комментарии, пожалуйста, указывайте их в разделе комментариев ниже.