一旦控制传递给 blockingHandler,vertx.eventloop 线程会发生什么?

What happens to vertx.eventloop thread once the control passes to 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 对性能有影响吗?

处理多个处理程序的理想方式是什么?

谢谢, 尼蒂什·戈亚尔

What happens to event loop threads when the control passes to blockingHandler? Do they continue to accept more requests?

是的,事件循环会将阻塞处理程序部分卸载到工作池并处理其他事件。

If yes, what happens when the blocking handler execution completes?

一个带有结果的事件被添加到事件循环队列中。

Does this switching from eventLoop to blockingHandler (workerPool) and then back to eventLoop has any performance implications?

线程之间的切换不是免费的,但在这种用例(api 网关)的总体延迟中成本应该可以忽略不计。

What is the ideal way to handle multiple handlers?

理想情况下,您应该避免在 Vert.x Web 处理程序中阻塞代码。