Практика Open API Gateway (3) — Текущее ограничение

Java
Практика Open API Gateway (3) — Текущее ограничение

Как спроектировать и реализовать текущее ограничение облегченного открытого шлюза API

Адрес статьи:blog.Park Ruiqing.com/2019/08/26/…

предисловие

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

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

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

Возьмите каштан 🌰, покупка билетов онлайн в праздничные дни, часто встречаются排队中,系统繁忙请稍后再试Ожидание подсказки означает, что сервер установил ограничение на количество запросов, обрабатываемых в единицу времени.При превышении ограничения он ставится в очередь, понижает или даже отказывает в обслуживании.В противном случае при сбое системы все будут не сможет купить билеты ╮( ̄▽ ̄ )╭.

12306系统繁忙

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

Его конечная цель: сделать это, не имея возможности обрабатывать слишком высокий уровень параллелизма.有损服务чем не служить.

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

корзина с жетонами

Алгоритм ведра токенов — это ведро, в котором хранится фиксированное количество токенов для добавления токенов с фиксированной скоростью, как показано на рисунке:

令牌桶算法

  • Добавляйте токены в корзину по фиксированной ставке.
  • Отказаться от добавления новых токенов, когда ведро заполнено.
  • На запрос расходуется один токен (также может потребляться соответствующее количество токенов в зависимости от размера пакета).
  • Когда токена недостаточно, отклоните запрос (или подождите).
  • Особенности: Может справиться с определенной степенью чрезвычайных ситуаций.

Возьмем более распространенный пример из реальной жизни, чтобы понять, кинотеатр продает билеты, и количество проданных билетов на каждый фильм определяется токеном выдачи), либо не читается (отклоняется).

дырявое ведро

Дырявое ведро - это ведро с отверстием на дне, и вода может вытекать с постоянной скоростью (давление в это время не учитывается и не используется ( ̄. ̄)), поэтому в отличие от токена ведро, алгоритм дырявого ведра потребляется с постоянной скоростью и может использоваться для проведения流量整形и流量控制. Как показано:

漏桶算法

  • Дырявое ведро с фиксированной вместимостью, которое вытекает с фиксированной скоростью (не беспокойтесь о глубине и давлении воды).
  • Скорость притока воды фиксируется, а перелив отбрасывается.
  • Особенности: Гладкая скорость обработки.
[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пу Жуйцина, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка: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)

Эпилог

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

Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"

Серия статей:

Добро пожаловать в публичный аккаунт:

[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.