предисловие
Для систем с высокой степенью параллелизма существует три инструмента для защиты системы:тайник,понизить рейтингиОграничение. Распространенными сценариями применения текущего лимита являются всплески, заказы, комментарии и т. д.внезапныйПроблемы параллелизма.
-
тайникЦель состоит в том, чтобы повыситьСкорость доступа к системеиПропускная способность системы.
-
понизить рейтингэто при подачечто-то идет не такИли повлиять на производительность основного процесса, вам нужновременно заблокирован,обращатьсявершина горыилиПосле решения проблемыОткройте снова.
-
Некоторые сценарии не работаюттайникипонизить рейтингДля решения, например, дефицитных ресурсов (seckill, snap-up), написания услуг (таких как комментарии, размещение заказов), частых сложных запросов (последние комментарии). Следовательно, должны быть средства, ограничивающиеПараллелизм/объем запросов,СейчасОграничение.
текст
Цель дросселирования
Цель ограничения тока состоит в том, чтобыОдновременный доступ / запросограничение скорости иливременное окнозапросы на ограничение скорости вСистема защиты, как только будет достигнута предельная скорость, вы можетеотказ в обслуживании(направляет на страницу с ошибкой или сообщает, что ресурс больше недоступен),очередьилиждать(например, всплески, комментарии и заказы), понижение рейтинга (по умолчанию доступен возврат к базовым данным или данным по умолчанию, таким как перечень сведений о продукте).
способ ограничения
-
ограничениеполный параллелизм(Напримерпул соединений с базой данных,Пул потоков)
-
ограничениеМгновенный параллелизм(как
nginx
изlimit_conn
Модуль, для ограниченияМгновенные одновременные соединения) -
ограничениеСредняя скорость во временном окне(как
Guava
изRateLimiter
,nginx
изlimit_req
модуль, ограничивающий среднюю скорость в секунду) -
ограничениеудаленный интерфейсскорость вызова
-
ограничение
MQ
скорость потребления -
может основываться наколичество сетевых подключений,Сетевой трафик,
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:
-
Ограничение плавного импульса тока (
SmoothBursty
) -
Плавное ограничение тока прогрева (
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
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.