Краткий обзор принципа Sentinel

Java

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

image-20200406140842159

Другие системы находятся в неуправляемом состоянии.Предпосылка требования стабильной работы других систем состоит в том, чтобы гарантировать, что вы можете работать стабильно. Итак, что нам нужно сделать, так это поддерживать работу независимо от других систем. Итак, как это сделать? К классическим инструментам на рынке, таким как Hystrix, конечно же, Ali также предоставляет набор более мощных и простых в использовании инструментов Sentinel.

Sentinel, Cystrix Сравнение:GitHub.com/alibaba/s ru…

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

Основные возможности Sentinel:

  • Управление потоком: формируйте запрос в правильную форму.
  • Расплавление и переход на более раннюю версию: когда зависимый ресурс нестабилен, ограничьте вызываемый ресурс и сделайте запрос быстрым сбоем.
  • Защита системной нагрузки: если ЦП слишком высок, а количество пулов потоков слишком велико, необходимо ввести некоторые ограничения на новые запросы.

Ссылаться на:Что такое Сентинел

Основное использование

Хотя Sentinel предоставляет множество способов использования его, большую часть времени основное использование соответствовало нашим требованиям. Здесь упоминается только общее использование.

1 Введите зависимости и напишите Sentinel Code

			  Entry sentinel = null;
        try {
            sentinel = SphU.entry(request.getName());
            // 业务代码
        } 				
				catch (BlockException blockException) {
            log.error("BlockException! request={}", request, blockException);         
        }           
				finally {
            if (sentinel != null){
                sentinel.exit();
            }
        }    

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

Представляем панель инструментов:GitHub.com/alibaba/s ru…

Sentinel поддерживает следующие правила:

  • Правила управления потоком: соответствующие FlowRule в коде.
  • Правила понижения Fuse: соответствуют DegradeRule
  • Правила защиты системы: соответствующие SystemRule
  • Правила контроля доступа к источнику: в соответствии с AuthorRule
  • Правила параметров Hotspot: соответствующие ParamFlowRule

Каждое правило имеет свой собственный соответствующий RuleManager, чтобы сделать его эффективным, например предопределенные правила управления потоком в коде:

   // 定义流量控制规则,限制QPS不高于20
	 private static void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        // set limit qps to 20
        rule.setCount(20);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rules.add(rule);

        // 将规则加载到内存,后续流量控制根据加载的规则进行处理
        FlowRuleManager.loadRules(rules);
    }

3 Проверьте панель мониторинга или журнал, чтобы узнать, вступит ли в силу понижение текущего ограничения.

  • Расположение журнала: /home directory/logs/csp/sentinel связанные журналы
  • Панель мониторинга: вы можете просматривать текущий статус различных правил
    img

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

Обзор принципа

Взяв следующий код в качестве примера, какую операцию Sentinel выполняет внутри себя для реализации текущей функции ограничения и понижения?

SphU.entry("HelloWorld")

1 Sentinel работает с ресурсами, entry("HelloWorld") представляет имя для обработкиHelloWorldРесурсы. После успешного выполнения операции возвращаетсяEntryОбъекты или генерировать исключение от имени не обработки текущего запроса (может считаться ограничением правил)

2 Ключевая часть кода внутри Shu.entry.

// 创建当前调用的上下文信息,为ThreadLocal变量。
// 如果是我们手工创建Context,一般可以指定name与origin(来源)。
// Context内部主要保存:
// - entranceNode  当前调用的入口Node
// - curEntry  当前正在处理的Entry,即每一次调用都会生成的Entry对象
// - origin 字符串,用来标记来源,统计的时候会用到
Context context = createContext();

// 查找当前资源的Slot处理链,一般一个资源对应一个ProcessorSlotChain,如果没有找到ProcessorSlotChain会创建默认的DefaultSlotChainBuilder。其中SLot顺序如下:
//       ProcessorSlotChain chain = new DefaultProcessorSlotChain();
//        chain.addLast(new NodeSelectorSlot());
//        chain.addLast(new ClusterBuilderSlot());
//        chain.addLast(new LogSlot());
//        chain.addLast(new StatisticSlot());
//        chain.addLast(new AuthoritySlot());
//        chain.addLast(new SystemSlot());
//        chain.addLast(new FlowSlot());
//        chain.addLast(new DegradeSlot());
ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper);


// 创建Entry与SlotChain处理Entry
// 其中依次调用上面的Slot进行处理。
Entry e = new CtEntry(resourceWrapper, chain, context);
chain.entry(context, resourceWrapper, null, count, prioritized, args);

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

image.png

  • TreeNodeBuilder соответствует NodeSelectorSlot, который в основном отвечает за сбор путей к ресурсам и сохранение путей вызовов этих ресурсов в древовидной структуре, которая используется для ограничения и деградации тока в соответствии с путями вызовов.
  • ClusterNode соответствует ClusterBuilderSlot, который используется для хранения статистики ресурса и информации о вызывающем абоненте, такой как RT, QPS, количество потоков и т. д. ресурса, который будет использоваться в качестве основы для многомерного ограничения тока и понижения;
  • StatisticSlot: основной слот. В нем находится статистика мониторинга различных измерений
  • FlowSlot, DegradeSlot, AuthoritySlot, SystemSlot: Методы реализации в основном одинаковы. В основном они основаны на статистических данных, чтобы определить, эффективны ли текущие правила. Если вы понимаете одно из них, вы можете сделать выводы из остальных. Конечно, , вы также можете написать свои собственные правила управления.

3 Согласно коде, я думаю, что более полная диаграмма тока должна быть:

image-20200406152106146

Принцип защиты системы

Общий процесс описан выше, посмотрите конкретное правило, чтобы понять, как оно работает.

1 Когда Sentinel получает ресурсы, он вызывает SlotChain и, как правило, переходит к SystemSlot для обработки.

2 SystemSlot, передать RuleManager для проверки соответствия ресурса условиям.

SystemRuleManager.checkSystem(resourceWrapper);

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

Основной код находится в SystemRuleManager

				...
				
        // load. BBR algorithm.
        if (highestSystemLoadIsSet && getCurrentSystemAvgLoad() > highestSystemLoad) {
            if (!checkBbr(currentThread)) {
                throw new SystemBlockException(resourceWrapper.getName(), "load");
            }
        }

        // cpu usage
        if (highestCpuUsageIsSet && getCurrentCpuUsage() > highestCpuUsage) {
            throw new SystemBlockException(resourceWrapper.getName(), "cpu");
        }

разное:

  • Статус системы обновляется через SystemStatusListener, а планировщик собирает статус системы каждую секунду.
  • Загрузка правил через SystemRuleManager.loadRules
  • Класс объекта конфигурации системного правила: SystemRule

Управление потоком QPS прямое отклонение

Sentinel предоставляет различные методы управления потоком данных,полный отказ,Warm Up,расстановка. соответствоватьFlowRuleсерединаcontrolBehaviorполе.

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

Request -> FlowSlot -> FlowRulechecker -> FlowRuleManager -> FlowRule -> ControlBehavior(TrafficShapingController) -> canPass

image-20200406154138713

Анализ LeapArray

Мы знаем, что Statisticslot является одним из основных гнездо, Sentinel для статистических данных в режиме реального времени, большая часть последующей понижения предельных правил основана на статистической статистике данныхLot для проверки. Так как же это статистически, вам нужно понять следующее.

Нижний уровень Sentinel использует высокопроизводительную структуру данных скользящего окна.LeapArrayДля подсчета данных индикатора второго уровня в реальном времени

1 Он имеет 4 ключевых свойства.

  • windowLengthInMs сколько миллисекунд на окно
  • sampleCount количество окон
  • intervalInMs Длительность интервала для подсчета
  • Массив — это место, где хранятся статистические данные.

Его соотношение следующее:

image-20200407075540295

2 Рассчитайте текущую позицию окна и время начала окна.

  • Получить текущее значение мс
  • Разделите текущее значение на windowLengthInMs, которое является интервалом окна, а затем возьмите остаток от sampleCount.

image-20200407080247637

3 Когда текущее временное окно истечет, укажите startTime текущего окна на время начала нового окна.

  • Время начала окна обновления
  • Сбросьте значение, хранящееся в окне, то есть предыдущее окно истекло

image-20200407081051397

4 Скользящее окно используется только для расчета окна, а структура хранения данных в окне использует MetricBucket. Он считает данные в 6 измерениях:

  • Каждое творение хранит MetricBucket
  • Каждый MetricBucket может считать следующие данные
public enum MetricEvent {

    /**
     * Normal pass.
     */
    PASS,
    /**
     * Normal block.
     */
    BLOCK,
    EXCEPTION,
    SUCCESS,
    RT,

    /**
     * Passed in future quota (pre-occupied, since 1.5.0).
     */
    OCCUPIED_PASS
}

Статистическое время

Мы знаем, что запись статистики данных в статистикеЛот, поэтому, когда приведены вышеуказанные индикаторы? Примерно следующим образом:

  • Добавьте THEADNUM, PASS при входе, увеличьте blockqps, столкнувшись с особыми исключениями, увеличьте количество исключений
  • Считайте УСПЕХ и RT на выходе

image-20200407082244170

public class StatisticSlot extends AbstractLinkedProcessorSlot<DefaultNode> {

    @Override
    public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count,
                      boolean prioritized, Object... args) throws Throwable {
        try {
            // Do some checking.
            fireEntry(context, resourceWrapper, node, count, prioritized, args);

            // Request passed, add thread count and pass count.
            node.increaseThreadNum();
            node.addPassRequest(count);
            ...           
        } catch (BlockException e) {
            // Blocked, set block exception to current entry.
            context.getCurEntry().setError(e);

            // Add block count.
            node.increaseBlockQps(count);          
            throw e;
        } catch (Throwable e) {
            // Unexpected error, set error to current entry.
            context.getCurEntry().setError(e);

            // This should not happen.
            node.increaseExceptionQps(count);          
            throw e;
        }
    }

    @Override
    public void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {
	         DefaultNode node = (DefaultNode)context.getCurNode();
            // Record response time and success count.
            node.addRtAndSuccess(rt, count);         
            node.decreaseThreadNum();

        fireExit(context, resourceWrapper, count);
    }
}

резюме

Здесь я в основном рассказываю о простом использовании Sentinel и общем потоке кода во время выполнения, не вникая в его структуру данных.

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

  • StatisticSlot: запись статистики данных в нескольких измерениях, в которых LeapArray используется для подсчета данных индикатора второго уровня.
  • FlowSlot, DegradeSlot, AuthoritySlot, SystemSlot: слияние, где понижение уровня ограничивает логическое суждение. Чтобы правило не действовало, определяется соответствующий следующему классу Debug.
  • Алгоритм управления потоком: класс реализации TrafficShapingController

Для получения дополнительной ссылки на содержание:GitHub.com/alibaba/s ru…