Высокое использование памяти Hystrix с более чем 1000 команд - PullRequest
0 голосов
/ 15 января 2020

Я наблюдаю высокое использование памяти при использовании более 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)),
...