Как maxQueueSize и queueSizeRejectionThreshold работают в Hystrix

Я пытаюсь понять, как использовать maxQueueSize внутри Hystrix. Согласно моей интерпретации, если сервер не может обслуживать запрос, клиенты будут хранить поток в очереди до тех пор, пока очередь не будет заполнена, а затем он вызовет исключение. И это поведение не зависит от execute.isolation.thread.timeoutInMilliseconds.

Чтобы продемонстрировать это, я написал два простых приложения. «А» - это клиент, который звонит «Б». В «B» я установил точку останова и вызвал ее из метода «A», который помечен @HystrixCommand.

@HystrixCommand(fallbackMethod = "fallback", commandProperties = {
        @HystrixProperty(name = 
"execution.isolation.thread.timeoutInMilliseconds", value = "20000"),
}, threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value = "1"),
        @HystrixProperty(name = "maxQueueSize", value = "2"),
        @HystrixProperty(name = "queueSizeRejectionThreshold", value = "2")
},)

Я отправил 6 запросов, но ни один из них не был отклонен, хотя порог был установлен на 2. Конечно, каждый поток останавливался через 20000 мс, как было определено. Как должны работать maxQueueSize и queueSizeRejectionThreshold?

Вы думали о чтении документация?

user268396 16.01.2019 23:43

Да, есть, но не понял.

Csepi 17.01.2019 08:46
0
2
970
1

Ответы 1

В документация говорится, что максимальное значение QueueSize

... cannot be resized or changed without re-initializing the thread executor which is not supported.

Это означает, что если вам нужен фиксированный размер очереди, вам нужно только установить maximumQueueSize при запуске, и если вы хотите изменить размер во время выполнения, вы можете установить queueSizeRejectionThreshold

Что касается того, почему в вашем приложении ничего не заблокировали; Вы уверены, что отправленные вами запросы обрабатываются долго? Другими словами, вы заполняете очередь? Если запрос возвращает ответ быстро, очередь не заполняется.

Другие вопросы по теме