Что происходит с потоком vertx.eventloop, когда управление переходит к blockingHandler?

#vert.x #vertx-verticle #vert.x-webclient

#vert.x #vertx-verticle #vert.x-webclient

Вопрос:

Я использую vert.x в качестве шлюза api, и каждый запрос должен проходить через несколько обработчиков Пример фрагмента кода

 router.route(BASE_PATH)
                .method(HttpMethod.POST)
                .handler(LoggerHandler.create(LoggerFormat.SHORT))
                .handler(BodyHandler.create())
                .blockingHandler(this::authRouter)
                .blockingHandler(this::reqValidationRouter)
                .handler(this::downStreamRouter)
                .blockingHandler(this::responseTransformRouter)
  

Что происходит с потоками цикла событий, когда управление переходит к blockingHandler? Продолжают ли они принимать больше запросов? Если да, то что происходит, когда выполнение обработчика блокировки завершается?
Имеет ли какое-либо влияние на производительность переключение с eventLoop на blockingHandler (WorkerPool), а затем обратно на eventLoop?

Каков идеальный способ обработки нескольких обработчиков?

Спасибо, Nitish Goyal

Ответ №1:

Что происходит с потоками цикла событий, когда управление переходит к blockingHandler? Продолжают ли они принимать больше запросов?

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

Если да, то что происходит, когда выполнение обработчика блокировки завершается?

Событие с результатом добавляется в очередь цикла событий.

Имеет ли какое-либо влияние на производительность переключение с eventLoop на blockingHandler (WorkerPool), а затем обратно на eventLoop?

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

Каков идеальный способ обработки нескольких обработчиков?

В идеале вам следует избегать блокировки кода в ваших веб-обработчиках Vert.x.

Комментарии:

1. Большое спасибо, приятель. В моем примере использования, приведенном выше, authRouter — это сторонняя служба, которую я вызываю внутри blockingHandler. Я могу завершить этот вызов с помощью веб-клиента vert.x? Или у вас есть какие-то другие рекомендации?

2. Если вы вызываете стороннюю службу по HTTP, то да, вы могли бы использовать веб-клиент и сделать блокировку стандартным обработчиком маршрута.