微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Webflux / Reactor:reactor-http-nio vs boundedElastic

如何解决Spring Webflux / Reactor:reactor-http-nio vs boundedElastic

我对一些关于每个请求所属的线程模型的反应器概念有点困惑。我读过https://projectreactor.io/docs/core/release/reference,但还是不清楚。让我们看一个例子:

@Autowired
UserRepository userRepository;

@GetMapping
Flux<User> findAll() {
    log.info("findAll request arrived");
    final Flux<User> defer = Flux.defer(() -> {
          return Flux.fromIterable(userRepository.findAll());
    });
    return defer;
}

日志:[boundedElastic-4] - INFO - findAll 请求到达

在 Schedulers.boundedElastic 线程池中执行 GET 方法(根据文档进行 I/O 绑定工作)

@PostMapping
Mono<User> save(@RequestBody User user) {
    log.info("save request arrived");
    final Mono<User> newUser = Mono.fromCallable(() -> {
         final User userMono = userRepository.save(user);
          log.info("user saved!");
          return userMono;
    });
    return newUser.subscribeOn(Schedulers.boundedElastic());
}

日志:[reactor-http-nio-6] - INFO - 保存请求到达

POST 方法属于 http-nio 线程池。

@PostMapping("/test")
Mono<User> test() {
    log.info("test");
    return Mono.just(new User());
}

没有正文的 POST 也属于 Schedulers.boundedElastic。

@Bean
public ReactiveWebServerFactory reactiveWebServerFactory() {
    NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
    final ReactorResourceFactory reactorResourceFactory = new ReactorResourceFactory();
    reactorResourceFactory.setLoopResources(LoopResources.create("http-nio",4,true));
    reactorResourceFactory.setUseGlobalResources(false);
    factory.setResourceFactory(reactorResourceFactory);
    factory.setPort(8080);
    return factory;
}

这是我如何配置 http-nio 线程池。

所以,我的问题是:

  1. 为什么带有正文的 POST 方法会被 http-nio 线程池处理?
  2. 这个 http-nio 线程池应该是一个较小的线程池,那么为什么带有主体的 POST 方法(我认为被认为是阻塞代码)落在它们身上?
  3. 有意义 return newUser.subscribeOn(Schedulers.boundedElastic()); 还是应该保持在同一个线程上?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。