Во-первых, например, зачем делать "ограничение".
Туристические достопримечательности обычно имеют наибольший прием. Невозможно поставить туристов, введя. Например, только 80 000 билетов в день, более 80 000 туристов, потому что если бы более 80 000 человек, работа в привлечении персонала не может прийти, слишком любые достопримечательности также повлияет на опыт и настроение туристов, и будут опасно для безопасности;
Продавайте только N билетов, что является средством ограничения тока.
Ограничение тока в программной архитектуре
Текущий лимит в программной архитектуре аналогичен.Когда системных ресурсов недостаточно, этого недостаточно для обработки большого количества запросов.Чтобы обеспечить нормальную работу службы, согласно правилам, система будет напрямую отклонять избыточные запросы для достижения предела эффекта потока;
Внешний предел тока:Слишком много пользователей или увеличение трафика, вызванное определенной активностью или актуальной проблемой, вредоносными атаками или данными, просканированными поисковыми роботами и т. д. Я не знаю, замечали ли вы, что, например, на Double 11 сразу после 12 часов некоторые веб-страницы или приложения клиентов будут отображать сообщение о том, что заказ не выполнен, а некоторые из них были ограничены.
Ограничение внутреннего тока:В большинстве компаний системы и системы будут звонить друг другу.Если система А вызывается тремя системами X, Y и Z, когда доступ к системе X чрезмерно увеличивается, вызывая вызов системы А и зависание, это приведет к to Системы Y и Z также не могут нормально использоваться (в зависимости от системы A).
встречный метод
Принцип метода счетчика заключается в том, чтобы ограничить количество запросов на обработку в единицу времени, чтобы не превышать пороговое значение.
Например, если интерфейс может обрабатывать 1000 запросов за одну минуту, вы можете установить счетчик, при поступлении запроса счетчик будет увеличиваться на 1. Если счетчик превысит 1000 в течение одной минуты, последующие запросы не будут обрабатываться;
Однако очевидны и недостатки этого метода.Поскольку запрошенный доступ не обязательно очень гладкий, если в 0:59 приходит 1000 запросов, 1:01 это уже следующее окно, и приходит еще 1000 запросов, но по факту в течение трех секунд приходит 2000 запросов, что превысило наш текущий предел лимита;
public class CounterTest {
public static void main(String[] args) {
long timeStamp = System.currentTimeMillis();
int timeCount = 1;
int reqCount = 0; //单位时间内的请求数量
int reqCountTotal = 0; //请求总数
final int limit = 10; // 时间窗口内最大请求数
final long interval = 1000; // 时间窗口ms
for(;;){
// 当前时间
long now = System.currentTimeMillis();
if (now < timeStamp + interval) {
//在之间窗口内
reqCount ++ ;
//没有超过单位时间的请求数量
if(reqCount < limit){
reqCountTotal ++ ;
System.out.println(timeCount + " : " + reqCountTotal);
}
}else {
//下一个时间窗口
timeStamp = now;
reqCount = 0 ;
timeCount ++ ;
}
}
}
}
Алгоритм скользящего окна
Также возьмем приведенный выше пример, одна минута разделена на 6 частей, каждая часть составляет 10 секунд; каждые 10 секунд наше временное окно сдвигается на одну сетку вправо, каждая сетка имеет независимый счетчик, и мы считаем время каждый раз, когда число в окне, которое решает проблему в методе счетчика, иЧем больше сеток в скользящем окне, тем точнее будет текущая статистика ограничения.
Для получения более подробной информации обратитесь к следующему рисунку для более четкого представления:
алгоритм дырявого ведра
Этот алгоритм также очень прост, то есть у нас есть ведро фиксированной емкости, и в течении воды есть вода, а вода вытекает. Нам не нужно контролировать скорость притока, но только скорость оттока. Если Вода течет слишком быстро, ведро заполнено., Избыточная вода будет переполнена, и не повлияет на скорость потока воды.
Алгоритм ведра токенов
Есть еще ведро, а в ведре N токенов.Все запросы должны получить доступный токен перед обработкой.Если в ведре нет токена, то в обслуживании будет отказано;алгоритм ведра токенов Принцип заключается в том, что система будет помещать токены в ведро с постоянной скоростью.
Некоторые люди могут спутать алгоритм дырявого ведра с алгоритмом ведра для токенов, но в некотором смысле алгоритм ведра для токенов действительно является улучшением алгоритма дырявого ведра.Разница между ними заключается в том, что алгоритм дырявого ведра может принудительно ограничивать скорость передачи данных, в то время как алгоритм ведра маркера может ограничивать среднюю скорость передачи данных, допуская при этом определенную степень пакетной передачи;
То есть, если в корзине токенов есть токен, разрешена отправка трафика; если в корзине токенов нет, то трафик не может быть отправлен; действие по размещению токена выполняется постоянно, Например, размер ведра равен 100. Когда запросов нет, количество токенов в ведре всегда сохраняется равным 100. Когда в следующую секунду поступает большое количество запросов,Может мгновенно избавиться от «сохраненных» 100 токенов, а затем продолжайте движение с постоянной скоростью.
Amway снова использует пакет guava с открытым исходным кодом от Google, используйтеRateLimiter Мы можем легко создать текущий ограничитель для алгоритма ведра токенов.
import java.util.concurrent.Executors;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterTest {
public static void main(String[] args) {
testRateLimiter();
}
public static void testRateLimiter() {
ListeningExecutorService executorService = MoreExecutors
.listeningDecorator(Executors.newFixedThreadPool(5));
RateLimiter limiter = RateLimiter.create(4); // 每秒不超过4个任务被提交
int num = 0 ;
for (;;) {
limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞
num ++ ;
executorService.submit(new Task("is "+ num));
}
}
}
class Task implements Runnable{
String str;
public Task(String str){
this.str = str;
}
@Override
public void run() {
System.out.println("Task call execute.." + str);
}
}
Дядя, который знает код | Текст [Оригинал]