Что такое ограничитель скорости и зачем он нужен? Какие типы и алгоритмы ограничения скорости?

Hosting Fozzy

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

Что такое ограничитель скорости и зачем он нужен? Какие типы и алгоритмы ограничения скорости?

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

Что такое ограничение скорости?

Ограничение скорости — это защитный метод, который ограничивает количество запросов, которые могут достичь вашего API, чтобы защитить его от непреднамеренного или злонамеренного использования. Без ограничения скорости вы рискуете нехваткой ресурсов из-за отказов в обслуживании на основе нагрузки, сбоев в системе безопасности и увеличения эксплуатационных расходов.

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

Зачем использовать ограничитель скорости?

Ниже приведены три причины для использования ограничителя скорости.

1. Предотвращение нехватки ресурсов

Наиболее распространенной причиной ограничения скорости является предотвращение нехватки ресурсов и повышение доступности служб на основе API. Ограничение скорости также может помочь вам предотвратить атаки типа «отказ в обслуживании» (DoS) на основе нагрузки. Другие пользователи не голодают, даже если один пользователь бомбардирует API кучей запросов.

2. Безопасность

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

3. Предотвращение операционных расходов

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

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

Ограничение скорости может быть применено к следующим параметрам:

Hosting CityHost

1. Ограничение частоты пользователей

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

2. Ограничение скорости параллелизма

Здесь используется ограничение на количество параллельных сеансов, которые могут быть разрешены для пользователя в заданный период времени. Ограничение на количество параллельных подключений также помогает смягчить распределенные атаки типа «отказ в обслуживании» (DDoS).

3. Ограничение скорости определения местоположения и идентификатора

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

4. Ограничение скорости сервера

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

Общие алгоритмы ограничения скорости

5 распространенных алгоритмов ограничения скорости:

  • Дырявое ведро;
  • Ведро токенов;
  • Фиксированный счетчик окон;
  • Скользящий журнал;
  • Раздвижное окно.

1. Дырявое ведро

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

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

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

2. Ведро токенов

Алгоритм ведра с токенами похож на дырявое ведро, но вместо этого мы назначаем токены на уровне пользователя. Для данного периода времени d определяется количество пакетов запросов r, которые может получить пользователь. Каждый раз, когда на сервер поступает новый запрос, происходят две операции:

  • Извлечь токен: извлекается текущее количество токенов для этого пользователя. Если он превышает установленный лимит, запрос отбрасывается.
  • Обновить токен: если полученный токен меньше предела для продолжительности времени d, то запрос принимается, и токен добавляется.

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

3. Фиксированный счетчик окон

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

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

4. Скользящий журнал

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

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

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

5. Раздвижное окно

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

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

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

Как применить ограничитель скорости в распределенных системах?

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

Несоответствие

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

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

Есть два пути решения этой проблемы:

  • Прикрепленный сеанс. Когда вы вводите закрепленный сеанс в балансировщиках нагрузки, каждый потребитель отправляется ровно на один узел. Недостатком этой стратегии является отсутствие отказоустойчивости и проблемы с масштабированием при перегрузке узлов.
  • Централизованное хранилище данных: вы можете использовать централизованное хранилище данных для обработки подсчетов для каждого окна и потребителя. Хотя это увеличивает задержку, гибкость, которую оно обеспечивает, делает его элегантным решением.

Условия гонки

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

Дросселирование

Дросселирование — это процесс контроля использования API клиентами в течение определенного периода. Дросселирование может быть определено на уровне приложения и/или на уровне API. При превышении порогового значения сервер возвращает HTTP-статус «429 — слишком много запросов».

Существует три типа дросселирования:

  1. Жесткое дросселирование: количество запросов API не может превышать предел дросселирования.
  2. Мягкое дросселирование: в этом типе мы можем установить лимит запросов API, чтобы он превышал определенный процент. Например, если у нас есть ограничение скорости 100 сообщений в минуту и ​​превышение лимита на 10 процентов, наш ограничитель скорости позволит до 110 сообщений в минуту.
  3. Эластичное или динамическое дросселирование. При эластичном дросселировании количество запросов может превысить пороговое значение, если в системе есть доступные ресурсы. Например, если пользователю разрешено только 100 сообщений в минуту, мы можем позволить пользователю отправлять более 100 сообщений в минуту, когда в системе есть свободные ресурсы.

Hosting Fozzy

Оцените статью
Поделиться с друзьями
Валерий Матафонов

Автор блога WM-IT.pro. Занимаюсь разработкой и оптимизацией сайтов с 2010 года.

WM-IT.pro - Блог об информационных технологиях
Добавить комментарий