Краткое изложение текущей схемы ограничения одновременно работающих Трех мушкетеров

задняя часть база данных алгоритм балансировки нагрузки

предисловие

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

  1. тайникЦель состоит в том, чтобы повыситьСкорость доступа к системеиПропускная способность системы.

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

  3. Некоторые сценарии не работаюттайникипонизить рейтингДля решения, например, дефицитных ресурсов (seckill, snap-up), написания услуг (таких как комментарии, размещение заказов), частых сложных запросов (последние комментарии). Следовательно, должны быть средства, ограничивающиеПараллелизм/объем запросов,СейчасОграничение.

текст

Цель дросселирования

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

способ ограничения

  1. ограничениеполный параллелизм(Напримерпул соединений с базой данных,Пул потоков)

  2. ограничениеМгновенный параллелизм(какnginxизlimit_connМодуль, для ограниченияМгновенные одновременные соединения)

  3. ограничениеСредняя скорость во временном окне(какGuavaизRateLimiter,nginxизlimit_reqмодуль, ограничивающий среднюю скорость в секунду)

  4. ограничениеудаленный интерфейсскорость вызова

  5. ограничениеMQскорость потребления

  6. может основываться наколичество сетевых подключений,Сетевой трафик,CPUилизагрузка памятиКак ограничение

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

1. Ведро жетонов

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

3. Счетчик

Иногда вы также можете использоватьприлавокДля ограничения тока, в основном используется для ограниченияполный параллелизм,Напримерпул соединений с базой данных,Пул потоков,Количество одновременных убийств. пройти черезГлобальное общее количество запросовилиОбщее количество запросов за определенный период временинаборПорогчтобы ограничить поток. Этопросто и грубоОграничение, а непредел средней ставки.

Token Bucket против дырявого ведра

Лимит ведра токенов составляетсредняя скорость притока, чтобы разрешить пакетные запросы и разрешить определенную степеньвзрыв трафика.

Предел дырявого ведрапостоянная скорость оттока, тем самым сглаживаяВсплеск скорости притока.

Ограничение уровня приложения

1. Ограничьте общее количество ресурсов

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

2. Ограничьте общее количество одновременных/соединений/запросов

если вы использовалиTomcat,ТотConnectorОдна из конфигураций имеет следующие параметры:

  • maxThreads: Tomcatможет быть запущен для обработки запросамаксимальное количество потоков, если объем обработки запроса всегда намного больше максимального количества потоков, он может зависнуть.

  • maxConnections: Мгновенное максимальное количество подключений, превышающийОжидающий.

  • acceptCount: еслиTomcatПоток занят в ответ, и будет установлено новое соединение.очередь,еслиПревышен размер очереди,ноВ соединении отказано.

3. Ограничьте общее количество одновременных/запросов интерфейса

использоватьJavaсерединаAtomicLong, с указанием кода:

try{
    if(atomic.incrementAndGet() > 限流数) {
        //拒绝请求
    } else {
        //处理请求
    }
} finally {
    atomic.decrementAndGet();
}

4. Ограничьте количество запросов временного окна для интерфейса

использоватьGuavaизCache, с указанием кода:

LoadingCache counter = CacheBuilder.newBuilder()
    .expireAfterWrite(2, TimeUnit.SECONDS)
    .build(newCacheLoader() {
        @Override
        public AtomicLong load(Long seconds) throws Exception {
            return newAtomicLong(0);
        }
    });

longlimit =1000;
while(true) {
    // 得到当前秒
    long currentSeconds = System.currentTimeMillis() /1000;
    if(counter.get(currentSeconds).incrementAndGet() > limit) {
        System.out.println("限流了: " + currentSeconds);
        continue;
    }
    // 业务处理
}

5. Плавно ограничивайте количество запросов к интерфейсу

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

Guava RateLimiterпри условииРеализация алгоритма Token Bucket:

  1. Ограничение плавного импульса тока (SmoothBursty)

  2. Плавное ограничение тока прогрева (SmoothWarmingUp) выполнить

Ограничение плавного импульса тока (SmoothBursty)

RateLimiter limiter = RateLimiter.create(5);
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());

Вы получите вывод, аналогичный следующему:

0.0
0.198239
0.196083
0.200609
0.199599
0.19961

Плавный разогрев

RateLimiter limiter = RateLimiter.create(5, 1000,  TimeUnit.MILLISECONDS);
for(inti = 1; i < 5; i++) {
    System.out.println(limiter.acquire());
}

Thread.sleep(1000L);
for(inti = 1; i < 5; i++) {
    System.out.println(limiter.acquire());
}

Вы получите вывод, аналогичный следующему:

0.0
0.51767
0.357814
0.219992
0.199984
0.0
0.360826
0.220166
0.199723
0.199555

SmoothWarmingUpсоздается:

RateLimiter.create(doublepermitsPerSecond, long warmupPeriod, TimeUnit unit);
  • разрешения в секунду: указываетновый в секундуколичество токенов
  • WarmupPeriod: указывает, что сСкорость холодного пускаПереход кСредняя оценкавременной интервал

Оценитьтрапециевидный подъемскорость, так сказатьХолодный запускбудет медленно достигать средней скорости с относительно большой скоростью, а затем стремиться кСредняя оценка(трапециевидный спуск к средней скорости). можно отрегулировать поwarmupPeriodРеализация параметра начинается с плавной фиксированной скорости.

Распределенное ограничение тока

Ключом к ограничению распределенного тока являетсяУслуга ограничения токасделатьраспыленныйИ решение можно использоватьredis + luaилиnginx + luaтехнология для реализации.

Ограничение тока уровня доступа

уровень доступаОбычно относится к вводу трафика запросов, основными целями этого уровня являются:

  • балансировки нагрузки
  • Незаконная фильтрация запросов
  • Агрегация запросов
  • Кэш, даунгрейд, текущий лимит
  • A/B-тестирование
  • Мониторинг качества обслуживания

заNginx Ограничение тока уровня доступаможно использоватьNginxПоставляется с двумя модулями:Модуль ограничения тока счетчика подключений ngx_http_limit_conn_moduleидырявое ведроАлгоритмически реализованоЗапрос модуля ограничения тока ngx_http_limit_req_module. также можно использоватьOpenRestyкоторый предоставилLuaМодуль ограничения токаlua-resty-limit-trafficпровестиболее сложныйСценарии ограничения тока.

  • limit_conn: используется для определенногоKEYсоответствующийобщее количество сетевых подключенийОграничение тока может быть выполнено следующим образомIP,Размер доменаОграничить ток.

  • limit_req: используется для определенногоKEYсоответствующийсредняя скорость запросовДля ограничения тока есть два варианта использования:плавный режим(delayПакетный режим включен (nodelay).

OpenRestyкоторый предоставилLuaМодуль ограничения токаlua-resty-limit-trafficВозможны более сложные сценарии ограничения тока.


Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

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