0

我使用 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 是否会对性能产生影响?

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

谢谢,尼蒂什·戈亚尔

4

1 回答 1

2

当控制权传递给blockingHandler时,事件循环线程会发生什么?他们是否继续接受更多请求?

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

如果是,当阻塞处理程序执行完成时会发生什么?

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

从 eventLoop 切换到 blockingHandler (workerPool) 然后再切换回 eventLoop 是否会对性能产生影响?

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

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

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

于 2020-09-02T13:02:49.437 回答