Что происходит с потоком vertx.eventloop, когда управление переходит к blockingHandler?
Я использую 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 какие-либо последствия для производительности?
Каков идеальный способ работы с несколькими обработчиками?
Спасибо, Нитиш Гоял
1 ответ
Что происходит с потоками цикла событий, когда управление переходит к blockingHandler? Продолжают ли они принимать больше запросов?
Да, цикл событий перенесет часть обработчика блокировки в рабочий пул и обработает другие события.
Если да, что произойдет, когда выполнение обработчика блокировки завершится?
Событие с результатом добавляется в очередь цикла событий.
Имеет ли такое переключение с eventLoop на blockingHandler (workerPool), а затем обратно на eventLoop какие-либо последствия для производительности?
Переключение между потоками не является бесплатным, но для такого варианта использования (шлюз api) общая задержка должна быть незначительной.
Каков идеальный способ работы с несколькими обработчиками?
В идеале вам следует избегать блокировки кода в ваших веб-обработчиках Vert.x.