Начало работы с ограничивающимися текущими предохранителями

Java

Для чего нужен ограничитель тока предохранителя: Для предотвращения сервисных лавин. Так что же такое сервисная лавина?

Вот несколько концепций:

Fail-fast: Fail-fast возникает, когда несколько потоков работают с небезопасными коллекциями в коллекциях в Java. По аналогии, когда мы разрабатываем веб-приложения, мы также рано завершаем недопустимые параметры (выбрасывая исключение или возвращая напрямую), чтобы избежать занятия последующих ресурсов и выполнения недопустимых вычислений.

Лавина кеша: база данных часто является узким местом веб-приложений.Чтобы избежать частого чтения базы данных, вводится локальный или распределенный кеш для хранения данных базы данных в памяти.Для данных, которых нет в кеше или неистекшие данные, база данных читается, чтобы уменьшить доступ к базе данных. Кэш часто устанавливается на определенное действительное время. Если в определенное время кеш становится недействительным коллективно. Приток обращений к данным в базе данных называется лавиной кеша.

Распределенная служба: раннее использование горизонтального расширения может не полностью использовать ресурсы для некоторых серверов, например, с интенсивным вводом-выводом и интенсивным использованием ЦП. Для этой цели вводятся распределенные службы, использующие подходящие серверы для конкретных служб и использующие rpc или http для передачи по сети.

Service Avalanche: несколько служб вызывают ссылки друг на друга, а основная ссылка часто может вызывать десять служб. Мы знаем, что по мере увеличения количества параллелизма время отклика системы резко увеличивается в течение определенного периода времени.

系统吞吐量评估方法

Если это происходит с сервисом по ссылке, RT (время ответа) резко возрастает, а сервис вверх по течению продолжает запросить, вызывая порочный круг. Более восходящие потоки ждут результата, тем больше перекидываются сервисы. Вся ссылка не может быть заблокирована. Используйте, называемую услугу Avalanche.

Решения:

Учитесь на неудачной идее. В случае тайм-аута rt произойдет быстрый сбой и возврат неправильного результата. - предохранитель

Учитесь у Cache Avalanche. Избегайте доступа к большому объему данных к приложению и контролируйте объем в разумных пределах. --Ограничение

Автономное ограничение тока и распределенное ограничение тока:

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

распределенныйЗатем вам нужно запустить еще один централизованный сервер счетов.Этот сервер будет генерировать только определенное количество голосов в секунду для каждого указанного ресурса.Прежде чем выполнять код в критической секции, перейдите в централизованный сервис счетов, чтобы получить билеты.Если вы получите успешно, вы можете выполнить Execute, в противном случае он выдаст исключение текущего ограничения или вернет false.

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

Основные алгоритмы ограничения тока в отрасли обычно включают следующее.

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

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

2. Ограничение тока дырявого ведра

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

3. Ограничение противотока

Иногда мы также используем счетчики для ограничения тока, в основном для ограничения общего количества параллелизма в течение определенного периода времени, например, количество одновременных пулов соединений с базой данных, пулов потоков и всплесков; текущее ограничение счетчика до тех пор, пока общее количество запросов в течение определенного периода времени превышает установленное пороговое значение ограничено, что является простым и грубым текущим пределом общего количества, а не текущим пределом средней скорости.

4. Алгоритм фиксированного окна (алгоритм скользящего окна)

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

Основные промышленные решения

Для ограничения тока на одной машине используется **RateLimiter от Guava и алгоритм корзины маркеров, главным образом потому, что он поддерживает пакетный трафик и является относительно зрелой готовой структурой. **Причина:Для ограничения тока на уровне интерфейса важнее обеспечить баланс скорости и разрешить определенный всплеск трафика..

Для распределенного ограничения тока в настоящее время существуют Hytrix и Sentinel.

Функция ограничения тока Hystrix

  1. Hystrix использует командный режим HystrixCommand(Command) для переноса зависимой логики вызова, и каждая команда выполняется в отдельном потоке/под авторизацией сигнала.
  2. Понизить выполнение резервного варианта на основе тайм-аута.
  3. Обеспечьте небольшой пул потоков (или сигнал) для каждой зависимости. Если пул потоков заполнен, вызов будет немедленно отклонен. По умолчанию очередь не используется. Ускорьте время оценки отказа.
  4. Зависит от результата вызова: успех, сбой (выброс исключения), тайм-аут, отклонение потока, короткое замыкание. Выполнение резервной логики при сбое запроса (исключение, отклонение, тайм-аут, короткое замыкание).
  5. Автоматический выключатель: обеспечивает автоматический выключатель на основе частоты отказов (50%), останавливая зависимости тока на период времени (10 секунд).
  6. Предоставляет зависимую статистику и мониторинг практически в реальном времени

использование интерфейса

Подробное использование интерфейса:blog.51CTO.com/developer Однажды…

使用命令模式封装依赖逻辑
public class HelloWorldCommand extends HystrixCommand<String> { 
    private final String name; 
    public HelloWorldCommand(String name) { 
        //最少配置:指定命令组名(CommandGroup) 
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); 
        this.name = name; 
    } 
    @Override 
    protected String run() { 
        // 依赖逻辑封装在run()方法中 
        return "Hello " + name +" thread:" + Thread.currentThread().getName(); 
    } 
    //调用实例 
    public static void main(String[] args) throws Exception{ 
        //每个Command对象只能调用一次,不可以重复调用, 
        //重复调用对应异常信息:This instance can only be executed once. Please instantiate a new instance. 
        HelloWorldCommand helloWorldCommand = new HelloWorldCommand("Synchronous-hystrix"); 
        //使用execute()同步调用代码,效果等同于:helloWorldCommand.queue().get();  
        String result = helloWorldCommand.execute(); 
        System.out.println("result=" + result); 
    
        helloWorldCommand = new HelloWorldCommand("Asynchronous-hystrix"); 
        //异步调用,可自由控制获取结果时机, 
        Future<String> future = helloWorldCommand.queue(); 
        //get操作不能超过command定义的超时时间,默认:1秒 
        result = future.get(100, TimeUnit.MILLISECONDS); 
        System.out.println("result=" + result); 
        System.out.println("mainThread=" + Thread.currentThread().getName()); 
    } 
        
} 

Функции, поддерживаемые Sential

  1. Текущее ограничение на основе QPS
  2. Текущий лимит на основе количества потоков
  3. Текущее регулирование на основе вызывающего абонента
  4. Черный и белый список
  5. Ограничьте ток по цепочке вызовов, например, посчитайте логику отбрасывания интерфейса C от A и B отдельно
  6. Ограничить текущий поток на основе условий гонки при чтении и записи ресурсов
  7. Поддержка интерфейса асинхронного ограничения тока
  8. Глобальное ограничение тока и автономное ограничение тока

Думать и подводить итоги

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

Используя полное регулирование потока Sentinel, мы можем выполнять регулирование потока на основе приоритета, например: когда сумма платежа велика, ограничить поток всех других связанных услуг.

Зачем использовать часовой

  1. hystrix поддерживает только предохранитель и понижение размера API и имеет меньше функций
  2. API проще в использовании, а код менее навязчив.
  3. Богатая логика ограничения тока для удовлетворения различных потребностей
  4. Богатый интерфейс мониторинга и информационная панель
  5. Высокая производительность и ограниченные ограничения дизайнерских идей PIPELINE, основанные на предшественниках, более легкие, для расширения
  6. Стабилен и одобрен командой промежуточного программного обеспечения Ali.
  7. Текущее ограничение ресурсов не ограничивается интерфейсами и поддерживает произвольные вызовы ресурсов.
Функция Sentinel Хайстрикс (Тесла)
Функция Sentinel Хайстрикс (Тесла)
Карантинная политика Изоляция семафора Изоляция пула потоков/изоляция семафора
стратегия понижения рейтинга автоматических выключателей На основе времени отклика или частоты отказов на основе частоты отказов
Реализация индикатора в реальном времени раздвижное окно Скользящее окно (на основе RxJava)
Конфигурация правила Поддерживает несколько источников данных Поддерживает несколько источников данных
Расширяемость несколько точек расширения форма плагина
Поддержка на основе аннотаций служба поддержки служба поддержки
Ограничение На основе количества запросов в секунду, поддержка текущего ограничения на основе отношения вызовов ограниченная поддержка
формирование трафика Поддержка медленного старта, режим постоянной скорости не поддерживается
Защита от нагрузки на систему служба поддержки не поддерживается
приставка Из коробки можно настраивать правила, просматривать мониторинг второго уровня, обнаружение машин и т.д. несовершенный
Адаптация общих фреймворков Сервлет, Spring Cloud, Dubbo, gRPC и т. д. Сервлет, Spring Cloud Netflix

Справочное содержание

Официальная документация по Guava — класс RateLimiter

Официальная документация Hystrixсегмент fault.com/ah/119000001…

hystrix, учебник по ограничению токаблог woo woo woo.cn on.com/also match/afraid/716…

Сентинел против ХистриксGitHub.com/alibaba/s ru…