Reactor Flux 和 Java Fiber 的区别

Apu*_*urv 4 java fibers project-reactor reactor-netty spring-webflux

我一直在阅读有关 Java Fibers 作为映射到线程的小工作单元的内容。如果发生阻塞调用,不同的纤程将被映射到同一个线程。由于 Java 中的线程是内核级线程,因此这可以防止线程耗尽。

我一直在使用Spring Web-Flux,所以只是想了解当Netty服务器每秒接收100个请求时内部会发生什么,每个请求都包括反应式数据库访问,这些请求如何映射到Netty服务器默认生成的40个线程?

通量与光纤有何不同?Flux 如何保证线程数量有限的异步行为?

Mic*_*rry 6

当 Netty 服务器每秒接收 100 个请求(每个请求都包含反应式数据库访问)时,内部会发生什么,这些请求如何映射到 Netty 服务器默认生成的 40 个线程?

简而言之,它接受这些请求并将它们分配给每个可用的底层线程(当这些线程变得可用时)“循环”样式。所有其他反应式调用也会发生同样的情况,当然,需要注意的是,具体取决于配置,它们可能在其他调度程序上运行,因此在具有不同线程数的其他底层线程池上运行。

通量与光纤有何不同?

这是一个非常大的话题,但“高级”概述是 Flux(我假设你指的是“反应式”Java 而不是它本身Flux)是一个异步模型,其中不允许线程阻塞,并且纤程是“绿色”的线程,设计为同步使用,利用抢占式调度(以及其他技术)来映射到更少的底层内核级线程。

在实践中,这意味着您可以使用与今天的 Fiber 几乎相同的线程模型和代码技术,但反应式编程将要求您采用新的范例。

Flux 如何保证线程数量有限的异步行为?

很简单,因为它被设计为异步的。这里的问题似乎是基于一个错误的前提 - 异步行为不能由可用线程的数量保证或不保证,而是由您的模型保证(如果它被请求淹没,它不能“溢出”到同步行为。 )