Я наблюдаю высокое использование памяти при использовании более 1000 команд Hystrix в моем сервисе.
Вариант использования:
- Служба выполняет вызовы REST.
- Каждая конечная точка REST может принимать тысячи вызовов. Необходимость размыкания цепи, когда конечная точка работает неправильно.
- Могут быть тысячи (верхняя граница 15000) таких конечных точек REST (каждая в другом домене).
- Нет общего группового ключа между этими REST конечные точки.
Я могу использовать около 1 ГБ памяти для примерно 10 000 уникальных команд, но не меньше. Вот настройка, которую я использую. Как вы можете видеть, я почти отключил показатели задержки. Что еще я могу сделать, чтобы уменьшить объем памяти? Я бы с удовольствием выкинул несколько старых HystrixCircuitBreaker
экземпляров из кеша, но не вижу никакого способа сделать это. Вместо UUID.randomUUID () я планирую передать контекст от вызывающей стороны.
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("BookreaderCommand"))
.andCommandKey(HystrixCommandKey.Factory.asKey("ReadBooks" + UUID.randomUUID()))
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.defaultSetter()
.withMaxQueueSize(20))
.andCommandPropertiesDefaults(HystrixCommandProperties.defaultSetter()
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
.withExecutionIsolationSemaphoreMaxConcurrentRequests(1)
.withCircuitBreakerSleepWindowInMilliseconds(300000)
.withExecutionTimeoutInMilliseconds(1000)
.withCircuitBreakerEnabled(true)
.withCircuitBreakerRequestVolumeThreshold(1)
.withCircuitBreakerErrorThresholdPercentage(100)
.withMetricsRollingStatisticalWindowInMilliseconds(1000)
.withMetricsRollingStatisticalWindowBuckets(1)
.withMetricsRollingPercentileEnabled(false) // Percentile not enabled.
.withMetricsRollingStatisticalWindowInMilliseconds(1000)
.withMetricsRollingPercentileWindowBuckets(1)
.withMetricsHealthSnapshotIntervalInMilliseconds(1000)),