问题描述
我使用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
解决方法
当控件传递给blockingHandler时,事件循环线程会发生什么?他们会继续接受更多的请求吗?
是的,事件循环将把阻塞处理程序部分卸载到工作池中并处理其他事件。
如果是,当阻塞处理程序执行完成时会发生什么?
带有结果的事件将添加到事件循环队列中。
从eventLoop切换到blockingHandler(workerPool)然后再回到eventLoop会对性能产生影响吗?
线程之间的切换不是免费的,但在这种用例(api网关)的总延迟中,成本应该可以忽略不计。
处理多个处理程序的理想方法是什么?
理想情况下,您避免在Vert.x Web处理程序中阻止代码。