在vertx-web背压示例中,为什么删除observeOn会增加延迟



在vertx web背压示例中,假设我将Server vertical作为标准vertical启动,observeOn(RxHelper.scheduler(vertx.getDelegate()))会做什么。

我在一台8核机器上部署了8个事件循环线程和8个垂直服务器实例我没有在路由的处理程序中进行阻塞IO调用

server.requestStream()
.toFlowable()
.map(HttpServerRequest::pause)
.onBackpressureDrop(req -> req.response().setStatusCode(503).end())
.observeOn(RxHelper.scheduler(vertx.getDelegate())) // Why does removing this line increase CPU and latency?
.subscribe(req -> {
req.resume();
router.accept(req);
});

也许是因为这样你就会使用默认的调度器,它不使用vertx事件循环,而且由于使用了java的正常线程模型,速度确实较慢。当然,除非您使用rxhelper中的helper方法将rxjava的默认调度器配置为事件循环和阻塞线程池。

RxJavaPlugins.setComputationSchedulerHandler(s -> RxHelper.scheduler(vertx));
RxJavaPlugins.setIoSchedulerHandler(s -> RxHelper.blockingScheduler(vertx));
RxJavaPlugins.setNewThreadSchedulerHandler(s -> RxHelper.scheduler(vertx));

文档:https://vertx.io/docs/vertx-rx/java2/#_scheduler_support

最新更新