Как спроектировать и реализовать текущее ограничение облегченного открытого шлюза API
Адрес статьи:blog.Park Ruiqing.com/2019/08/26/…
предисловие
При разработке системы с высокой степенью параллелизма существует несколько методов защиты системы, таких как кэширование, ограничение тока, переход на более раннюю версию и т. д. На уровне шлюза широко используется ограничение тока.Во многих случаях можно подумать, что ограничение тока на Шлюз не сильно связан с бизнесом (это связано с пропускной способностью системы), и каждая подсистема имеет требование ограничения тока, поэтому более целесообразно возложить некоторые функции ограничения тока на шлюз.
Что такое ограничение тока
Как мы все знаем, вычислительная мощность серверов и приложений веб-сайтов имеет верхний предел.Независимо от того, насколько высока конфигурация, всегда будет предел.При превышении предела могут возникнуть неконтролируемые последствия, если запрос будет разрешен для продолжения. .
Возьмите каштан 🌰, покупка билетов онлайн в праздничные дни, часто встречаются排队中,系统繁忙请稍后再试Ожидание подсказки означает, что сервер установил ограничение на количество запросов, обрабатываемых в единицу времени.При превышении ограничения он ставится в очередь, понижает или даже отказывает в обслуживании.В противном случае при сбое системы все будут не сможет купить билеты ╮( ̄▽ ̄ )╭.
Мы сначала даем限流Определение:限流Это один из методов защиты для систем с высокой степенью параллелизма, который широко используется на уровне шлюза. Его целью является ограничение скорости одновременных запросов или ограничение количества запросов в течение временного окна, и как только пороговое значение будет достигнуто, ожидание в очереди или понижение или даже отказ в обслуживании.
Его конечная цель: сделать это, не имея возможности обрабатывать слишком высокий уровень параллелизма.有损服务чем не служить.
Общий геймплей с ограничением тока
корзина с жетонами
Алгоритм ведра токенов — это ведро, в котором хранится фиксированное количество токенов для добавления токенов с фиксированной скоростью, как показано на рисунке:
- Добавляйте токены в корзину по фиксированной ставке.
- Отказаться от добавления новых токенов, когда ведро заполнено.
- На запрос расходуется один токен (также может потребляться соответствующее количество токенов в зависимости от размера пакета).
- Когда токена недостаточно, отклоните запрос (или подождите).
- Особенности: Может справиться с определенной степенью чрезвычайных ситуаций.
Возьмем более распространенный пример из реальной жизни, чтобы понять, кинотеатр продает билеты, и количество проданных билетов на каждый фильм определяется токеном выдачи), либо не читается (отклоняется).
дырявое ведро
Дырявое ведро - это ведро с отверстием на дне, и вода может вытекать с постоянной скоростью (давление в это время не учитывается и не используется ( ̄. ̄)), поэтому в отличие от токена ведро, алгоритм дырявого ведра потребляется с постоянной скоростью и может использоваться для проведения流量整形и流量控制. Как показано:
- Дырявое ведро с фиксированной вместимостью, которое вытекает с фиксированной скоростью (не беспокойтесь о глубине и давлении воды).
- Скорость притока воды фиксируется, а перелив отбрасывается.
- Особенности: Гладкая скорость обработки.
Эта статья была опубликована вБлог Пу Жуйцина, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.
Ограничение тока на уровне приложения
У монолитного приложения есть свой предел.В случае высокого параллелизма необходима защита от перегрузок, чтобы слишком большое количество запросов не давало системе сбой.Самый простой и грубый способ - использовать счетчик для контроля, +1 при обработке запросов, после обработки - 1, в дополнение к этому, мы также можем использовать упомянутые выше ведро токена и дырявое ведро для более точного ограничения тока.Если шлюз является одним приложением, мы можем напрямую использовать ограничение тока на уровне приложения.
прилавок
Этот метод самый простой и самый грубый,
try {
if (counter.incrementAndGet() > limit) {
throw new SomeException();
}
// do something
} finally {
counter.decrementAndGet();
}
корзина с жетонами
GuavaПредоставляет реализацию алгоритма ведра маркеров.
@Test
public void testGuavaRateLimiter() throws InterruptedException {
RateLimiter limiter = RateLimiter.create(5);
TimeUnit.SECONDS.sleep(1); // 等待一秒钟发几个令牌
for (int index = 0; index < 10; index++) {
System.out.println(limiter.acquire()); // 打印等待时间
}
}
Результат:
0.0
0.0
0.0
0.0
0.0
0.0
0.196108
0.194372
0.19631
0.198373
После того, как токен израсходован, последующие запросы должны ожидать новый токен, прежде чем продолжить.
Ограничение тока на уровне приложения легко реализовать, но его ограничение заключается в том, что оно не может выполнять полное ограничение тока и бессильно для кластеров.
Распределенное ограничение тока
Хотите сделать ограничение на полный рабочий день в кластере, ключом является запись текущей информации о потоке в общих носителях, таких какRedis,memcachedи т. д. Чтобы точно ограничить ток, записи должны быть атомарными.
Redis+Luaхороший выбор, напримерLuaСценарий выглядит следующим образом:
local key = KEYS[1] -- 限流的KEY
local limit = tonumber(ARGV[1]) -- 限流大小
local current = tonumber(redis.call('get', key) or '0')
if current + 1 > limit then
return 0
else
redis.call('INCRBY', key,'1')
redis.call('expire', key,ARGV[2]) -- 过期时间
return current + 1
end
- Распределенное регулирование размещает выпуск токенов на общем носителе.
- Операции получения (потребления) токена должны быть атомарными.
- Общие СМИ должны быть очень доступны (Cluster Redis)
Эпилог
Как барьер вне внутренней системы, шлюз играет определенную защитную роль во внутренней системе, и ограничение тока является одной из них.Ограничение тока на уровне шлюза может просто ограничивать ток для интерфейсов разных сервисов, или рассматривать ограничение Текущая функция вынесена в функциональный модуль шлюза (например, конфигурация и статистика правил ограничения тока, статистика и ограничение тока для пользовательского измерения и т. д.)
Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"
Серия статей:
- Практика открытия шлюза API (1) — проектирование шлюза API
- Практика Open API Gateway (2) — Повтор атаки и защита
- Практика Open API Gateway (3) — Текущее ограничение
Добро пожаловать в публичный аккаунт:
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.