Алгоритм ограничения тока
прилавок:
Счетчик относительно простой и грубый.Например, мы хотим ограничить количество запросов, которые можно передать за 1с.Идея реализации заключается в том, чтобы начать отсчет времени с первого запроса.В следующие 1с, количество входящих запросов для каждого запроса +1, что превышает максимальное количество запросов. Запрос будет отклонен, а счет будет очищен через 1 с, и счет будет перезапущен.
Этот метод имеет большой недостаток: Например, первые 10 мс проходили максимальное количество запросов, то следующие запросы 990 мс могут быть отклонены только. Это явление называется «Специальный феномен».
Алгоритм дырявого ведра:
То есть скорость воды, выходящей из дна ведра, постоянна, а скорость входящей воды может быть разной, но когда количество приходящей воды больше количества выходящей воды, вода будет помещается в ведро и не выбрасывается напрямую, однако у ведра также есть предел вместимости, когда пролитая часть ведра все равно будет выброшена, когда оно наполнится водой.
Реализация алгоритма: очередь может быть подготовлена для хранения временно необработанных запросов, а затем пул потоков может периодически получать запросы из очереди для выполнения.
Алгоритм ведра токенов:
Ведро токенов — это место, где производятся токены доступа. Скорость производства постоянна. Когда пользователи получают доступ, они могут получить доступ, когда в ведре есть токен. В противном случае будет активирован текущий лимит.
План реализации: Ограничение Гуавы Ратолимитр
Guava RateLimiter — это текущий ограничитель от Google, основанный на алгоритме корзины токенов и больше подходящий для систем с одним экземпляром.
Конкретная реализация ограничения тока
Текущий лимит шлюза:
Класс RequestRateLimiterGatewayFilterFactory предоставляется в Spring Cloud Gateway, который реализован на основе сегмента токенов. Он имеет встроенный RedisReteLimiter, который полагается на Redis для хранения текущей конфигурации ограничения и статистики.Мы также можем наследовать
org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter или реализация
org.springframework.cloud.gateway.filter.ratelimit.RateLimiter для реализации вашего собственного RateLimiter.
Конкретная реализация выглядит следующим образом:
1. Сначала введите зависимости в сервис шлюза
2. Конкретная конфигурация выглядит следующим образом.
3. Может быть достигнуто ограничение тока по трем параметрам:
Конфигурация, показанная выше, заключается в том, что количество токенов, генерируемых в секунду, равно 1. Когда наша скорость запроса превышает это значение, будет возвращен код состояния 429.
redis+lua
1. Внедрить lua-скрипты в сервис
2. Читать Луа
3. Решите, нужен код или нет
4. Выше мы видим, что при нормальных обстоятельствах за 10 секунд генерируются только 3 токена.Давайте посмотрим на эффект.
Видно, что только первые три запроса проходят в течение 10 секунд, а остальные отбрасываются, через 10 секунд будет три прошедших запроса, что полностью соответствует нашему ожидаемому эффекту.
Ограничение тока Nginx
Ограничить частоту доступа:
Nginx может ограничивать частоту доступа через параметр модуля ngx_http_limit_req_module, который реализуется алгоритмом дырявого ведра, для ограничения частоты обработки запросов одного ip можно использовать команду limit_req_zone и команду limit_req.
Ограничьте количество подключений:
Модуль ngx_http_limit_conn_module предоставляет функцию количества одновременных подключений, которую можно настроить с помощью команды limit_conn_zone и limit_conn, а также реализован на основе алгоритма дырявого ведра.
Помимо написания статей, позже автор будет поддерживать проект с открытым исходным кодом, поэтому студенты, у которых есть требования к исходному коду, могут обратить внимание на Xiamumu, который, как ожидается, будет открыт во время китайского Нового года в этом году.