Распределенная схема ограничения тока (ограничение тока шлюза, ограничение тока redis+lua, ограничение тока nginx)

распределенный

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

прилавок:

Счетчик относительно простой и грубый.Например, мы хотим ограничить количество запросов, которые можно передать за 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, который, как ожидается, будет открыт во время китайского Нового года в этом году.