Что происходит с потоком 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.

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