Spring Cloud Series девять приоритетов конфигурации Hystrix и подробное объяснение

Spring

1 Обзор

В этой статье подробно рассказывается о приоритете охвата параметров конфигурации Hystrix, типах настраиваемых параметров и элементах конфигурации.

Hystrix может настраивать следующие типы свойств:

  • Выполнение: управляет выполнением HystrixCommand.run().
  • Fallback: управляет выполнением HystrixCommand.getFallback().
  • Автоматический выключатель: управляет работой автоматических выключателей.
  • Метрики: фиксируйте свойства конфигурации, связанные с информацией о выполнении HystrixCommand и HystrixObservableCommand.
  • Контекст запроса: установите свойства контекста запроса.
  • Свойства коллапса: установите свойства запроса на слияние.
  • Свойства пула потоков: задайте свойства пула потоков.

2. Переопределить приоритет параметров Hystrix

Каждый параметр Hystrix имеет 4 места, которые можно настроить.Приоритет от низкого до высокого следующим образом.Если один и тот же атрибут настроен в каждом месте, значение с высоким приоритетом переопределит значение с низким приоритетом.

  • 1 Встроенное глобальное значение по умолчанию: значение, жестко закодированное в коде.
  • 2 Динамические глобальные свойства по умолчанию: настройте глобальные значения через файлы свойств
  • 3 Значение встроенного экземпляра по умолчанию: значение экземпляра, жестко запрограммированное в коде.
  • 4 Динамическая настройка свойств экземпляра: настройка значения конкретного экземпляра с помощью файла свойств.

3 Подробное объяснение свойств конфигурации Hystrix

Hystrix может настраивать следующие типы свойств:

  • Выполнение: управляет выполнением HystrixCommand.run().
  • Fallback: управляет выполнением HystrixCommand.getFallback().
  • Автоматический выключатель: управляет работой автоматических выключателей.
  • Метрики: фиксируйте свойства конфигурации, связанные с информацией о выполнении HystrixCommand и HystrixObservableCommand.
  • Контекст запроса: установите свойства контекста запроса.
  • Свойства коллапса: установите свойства запроса на слияние.
  • Свойства пула потоков: задайте свойства пула потоков.

3.1. Execution

Следующие свойства управляют выполнением HystrixCommand.run().

1. execution.isolation.strategy
Указывает стратегию изоляции во время выполнения HystrixCommand.run(). Существуют следующие две стратегии.

  • 1 THREAD: выполнение в отдельном потоке, одновременные запросы ограничены количеством потоков в пуле потоков.
  • 2 SEMAPHORE: выполняется в вызывающем потоке, количество одновременных запросов ограничено количеством семафоров.

По умолчанию рекомендуется, чтобы HystrixCommands использовали стратегию изоляции потоков, а HystrixObservableCommand — стратегию изоляции семафоров. Только в случае высокого параллелизма (один экземпляр достигает сотен вызовов в секунду) необходимо изменить стратегию изоляции HystrixCommands на семафор. Политики изоляции семафоров обычно используются только для несетевых вызовов.

По умолчанию: РЕЗКА,

// 设置所有实例的默认值
hystrix.command.default.execution.isolation.strategy=..
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.execution.isolation.strategy=...

2. execution.isolation.thread.timeoutInMilliseconds
Установите время ожидания выполнения вызывающего абонента (в миллисекундах)

По умолчанию: 1000

// 设置所有实例的默认值
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds=...

3. execution.timeout.enabled
Указывает, следует ли включить настройку тайм-аута.

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.execution.timeout.enabled=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.execution.timeout.enabled=...

4. execution.isolation.thread.interruptOnTimeout
Указывает, следует ли прерывать выполнение HystrixCommand.run() по истечении времени выполнения.

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.execution.isolation.thread.interruptOnTimeout=...

5. execution.isolation.thread.interruptOnCancel
Указывает, следует ли прерывать выполнение HystrixCommand.run() при отмене выполнения задачи.

По умолчанию: ложь

// 设置所有实例的默认值
hystrix.command.default.execution.isolation.thread.interruptOnCancel=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.execution.isolation.thread.interruptOnCancel

6. execution.isolation.semaphore.maxConcurrentRequests

Когда HystrixCommand.run() использует стратегию изоляции SEMAPHORE, установите максимальный параллелизм

По умолчанию: 10

// 设置所有实例的默认值
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=...

// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.execution.isolation.semaphore.maxConcurrentRequests=...

3.2. Fallback

Следующие свойства управляют тем, как выполняется HystrixCommand.getFallback(). Эти свойства работают как со стратегиями изоляции THREAD, так и с SEMAPHORE.
1. fallback.isolation.semaphore.maxConcurrentRequests
Это свойство устанавливает максимальное количество одновременных запросов, разрешенных от вызывающего потока к методу HystrixCommand.getFallback().
Если достигнут максимальный параллелизм, последующие запросы отклоняются и генерируется исключение.

По умолчанию: 10

// 设置所有实例的默认值
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.fallback.isolation.semaphore.maxConcurrentRequests=...

2. fallback.enabled
Включить ли резервную функцию

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.fallback.enabled=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.fallback.enabled=...

3.3. Circuit Breaker

Управление автоматическим выключателем

1. circuitBreaker.enabled
Следует ли разомкнуть функцию автоматического выключателя

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.circuitBreaker.enabled=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.circuitBreaker.enabled=...

2. circuitBreaker.requestVolumeThreshold

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

Если значение этого свойства равно 20, то в течение времени окна (например, в течение 10 с) и если будет получено только 19 запросов, и все они будут отклонены, автоматический выключатель не разомкнется.

По умолчанию: 20

// 设置所有实例的默认值
hystrix.command.default.circuitBreaker.requestVolumeThreshold=...

// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.circuitBreaker.requestVolumeThreshold=...

3. circuitBreaker.sleepWindowInMilliseconds
После срабатывания автоматического выключателя hystrix будет отклонять новые запросы в течение этого времени, и только по истечении этого времени автоматический выключатель откроет ворота.

По умолчанию: 5000

// 设置所有实例的默认值
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.circuitBreaker.sleepWindowInMilliseconds=...

4. circuitBreaker.errorThresholdPercentage

Установите пороговое значение процента отказа. Если частота отказов превышает это значение, автоматический выключатель отключается и вводится резервная логика.

По умолчанию: 50

// 设置所有实例的默认值
hystrix.command.default.circuitBreaker=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.circuitBreaker.errorThresholdPercentage=...

5. circuitBreaker.forceOpen
Если установлено значение true, автоматический выключатель будет отключен, все запросы будут отклонены.Это значение имеет приоритет над значением CircuitBreaker.forceClosed.

По умолчанию: ложь

// 设置所有实例的默认值
hystrix.command.default.circuitBreaker.forceOpen=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.circuitBreaker.forceOpen=...

6. circuitBreaker.forceClosed
Если установлено значение true, автоматический выключатель будет принудительно замкнут, и всем запросам будет разрешено выполняться, независимо от того, достигает ли количество сбоев значения CircuitBreaker.errorThresholdPercentage.

По умолчанию: ложь

// 设置所有实例的默认值
hystrix.command.default.circuitBreaker.forceClosed=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.circuitBreaker.forceClosed=...

3.4. Metrics

Захват свойств конфигурации, связанных с выполнением HystrixCommand и HystrixObservableCommand

1. metrics.rollingStats.timeInMilliseconds
Устанавливает продолжительность окна прокрутки статистики.

Если это значение равно 10 с, окно разделено на 10 сегментов, каждый сегмент соответствует 1 с, статистика выглядит следующим образом:
这里写图片描述

По умолчанию: 10000

// 设置所有实例的默认值
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=....

// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.rollingStats.timeInMilliseconds=...

2. metrics.rollingStats.numBuckets
Установите количество сегментов для прокручивающегося окна статистики,

Примечание. Должна быть установлена ​​следующая конфигурация, иначе будет выдано исключение.

metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0

Например: 10000/10, 10000/20 — правильная конфигурация, а 10000/7 — неправильная.

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

По умолчанию: 10

// 设置所有实例的默认值
hystrix.command.default.metrics.rollingStats.numBuckets=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.rollingStats.numBuckets=...

3. metrics.rollingPercentile.enabled

Устанавливает, будут ли задержки выполнения отслеживаться и учитываться в проценте сбоев. Если установлено значение false, все характеристики возвращают -1.

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.metrics.rollingPercentile.enabled=...

// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.rollingPercentile.enabled=...

4. metrics.rollingPercentile.timeInMilliseconds

Это свойство устанавливает продолжительность процентного окна прокрутки статистики.

По умолчанию: 60000

// 设置所有实例的默认值
hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.rollingPercentile.timeInMilliseconds=...

5. metrics.rollingPercentile.numBuckets
Установите количество сегментов для процентного окна статистики.

Примечание. Должна быть установлена ​​следующая конфигурация, иначе будет выдано исключение.

metrics.rollingPercentile.timeInMilliseconds % metrics.rollingPercentile.numBuckets == 0

Например: 60000/6, 60000/60 — правильная конфигурация, а 10000/7 — неправильная.

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

По умолчанию: 6

// 设置所有实例的默认值
hystrix.command.default.metrics.rollingPercentile.numBuckets=...

// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.rollingPercentile.numBuckets=...

6. metrics.rollingPercentile.bucketSize
Это свойство задает максимальное значение времени выполнения, сохраненного для каждого сегмента. Если количество бакетов 100 и окно статистики 10с, если в этих 10с 500 исполнений, то в бакет будут засчитаны только последние 100 исполнений

По умолчанию: 100

// 设置所有实例的默认值
hystrix.command.default.metrics.rollingPercentile.bucketSize=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.rollingPercentile.bucketSize=...

7. metrics.healthSnapshot.intervalInMilliseconds

интервал выборки

По умолчанию: 500

// 设置所有实例的默认值
hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.metrics.healthSnapshot.intervalInMilliseconds=...

3.5. Request Context

Это свойство управляет контекстом Hystrix, используемым HystrixCommand.

1. requestCache.enabled
Включить ли кэширование запросов

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.requestCache.enabled=...

// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.requestCache.enabled=...

2. requestLog.enabled
Указывает, следует ли открывать журнал, печатать выполнение HystrixCommand и события.

По умолчанию: правда

// 设置所有实例的默认值
hystrix.command.default.requestLog.enabled=...
// 设置实例HystrixCommandKey的此属性值
hystrix.command.HystrixCommandKey.requestLog.enabled=...

3.6. Collapser Properties

Установите свойства запроса на слияние

1. maxRequestsInBatch
Установите максимальное количество одновременных запросов на пакетное выполнение

По умолчанию: целое число.MAX_VALUE

// 设置所有实例的默认值
hystrix.collapser.default.maxRequestsInBatch=...
// 设置实例HystrixCommandKey的此属性值
hystrix.collapser.HystrixCollapserKey.maxRequestsInBatch=...

2. timerDelayInMilliseconds
Через какое время после создания пакета до запуска реального запроса

По умолчанию: 10

// 设置所有实例的默认值
hystrix.collapser.default.timerDelayInMilliseconds=...
// 设置实例HystrixCommandKey的此属性值
hystrix.collapser.HystrixCollapserKey.timerDelayInMilliseconds=...

3. requestCache.enabled
Включить ли кэширование запросов для HystrixCollapser.execute() и HystrixCollapser.queue()

По умолчанию: правда

// 设置所有实例的默认值
hystrix.collapser.default.requestCache.enabled=...
// 设置实例HystrixCommandKey的此属性值
hystrix.collapser.HystrixCollapserKey.requestCache.enabled=...

3.7. Thread Pool Properties

Установите поведение пула потоков Hystrix Commands, в большинстве случаев количество потоков равно 10.

Формула для расчета количества пулов потоков выглядит следующим образом:

最高峰时每秒的请求数量 × 99%命令执行时间 + 喘息空间

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

1. coreSize
Установить размер ядра пула потоков

По умолчанию: 10

// 设置所有实例的默认值
hystrix.threadpool.default.coreSize=...
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.coreSize=...

2. maximumSize
Установите максимальный размер пула потоков, это значение работает, только если установлено значение allowMaximumSizeToDivergeFromCoreSize.

По умолчанию: 10

// 设置所有实例的默认值
hystrix.threadpool.default.maximumSize=...
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.maximumSize=...

3. maxQueueSize
Установите значение самой большой очереди BlockingQueue. Если установлено -1, используется очередь SynchronousQueue, если установлено положительное число, используется очередь LinkedBlockingQueue.

По умолчанию: -1

// 设置所有实例的默认值
hystrix.threadpool.default.maxQueueSize=...
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.maxQueueSize=...

4. queueSizeRejectionThreshold
Поскольку значение maxQueueSize не может быть изменено динамически, длину очереди ожидания можно динамически изменить, задав это значение. То есть, когда количество ожидающих очередей больше, чем queueSizeRejectionThreshold (но не достигает значения maxQueueSize), последующие запросы на вхождение в очередь будут отклонены.

Если установлено -1, свойство не действует

По умолчанию: 5

// 设置所有实例的默认值
hystrix.threadpool.default.queueSizeRejectionThreshold=...
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.queueSizeRejectionThreshold=...

5. keepAliveTimeMinutes
После установки того, как долго поток не обслуживался, ему необходимо освободить (maximumSize-coreSize) потоки.

По умолчанию: 1

// 设置所有实例的默认值
hystrix.threadpool.default.keepAliveTimeMinutes=...
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.keepAliveTimeMinutes=...

6. allowMaximumSizeToDivergeFromCoreSize
MaximumSize работает только в том случае, если для параметра allowMaximumSizeToDivergeFromCoreSize установлено значение true.
По умолчанию: ложь

// 设置所有实例的默认值
hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=....
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.allowMaximumSizeToDivergeFromCoreSize=...

7. metrics.rollingStats.timeInMilliseconds
Установите время скользящего окна

По умолчанию: 10000

// 设置所有实例的默认值
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=true
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolKey.metrics.rollingStats.timeInMilliseconds=true

8. metrics.rollingStats.numBuckets
Устанавливает количество сегментов, на которые делится прокручивающееся статическое окно

Настроенное значение должно соответствовать следующим условиям:

metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0

По умолчанию: 10. Рекомендуется, чтобы продолжительность каждой корзины превышала 100 мс.

// 设置所有实例的默认值
hystrix.threadpool.default.metrics.rollingStats.numBuckets=...
// 设置实例HystrixCommandKey的此属性值
hystrix.threadpool.HystrixThreadPoolProperties.metrics.rollingStats.numBuckets=...