【问题标题】:Difference between Reactor Flux and Java FiberReactor Flux 和 Java Fiber 的区别
【发布时间】:2020-06-26 01:54:12
【问题描述】:

我一直在阅读有关 Java 光纤作为映射到线程的小型工作单元的信息。在阻塞调用的情况下,不同的 Fiber 将被映射到同一个线程。由于 Java 中的线程是内核级线程,因此可以防止线程耗尽。

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

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

【问题讨论】:

    标签: java spring-webflux project-reactor reactor-netty fibers


    【解决方案1】:

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

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

    助焊剂与光纤有何不同?

    这是一个非常大的话题,但“高级”概述是 Flux(我假设您的意思是“反应性”Java 而不是 Flux 本身)是一个异步模型,不允许任何线程阻塞, Fiber 是“绿色”线程,旨在同步使用,利用抢占式调度(以及其他技术)映射到更少的底层内核级线程。

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

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

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

    【讨论】:

    • Flux 有自己的线程池对吗?并且他们有自己的调度,Flux 是否也使用抢占式调度? Fibers 使用非阻塞 IO,Flux 也使用相同的吗?
    • 我认为您在这里混淆了术语 - 通量使用您分配给它的任何调度程序(以及任何底层执行程序)。这些调度程序通常不会包含使用抢占式调度的线程,这没有多大意义,因为无论如何您都不应该阻塞这些线程(它们通常是内核级线程。)反应式编程确实使用非阻塞 IO(它使用非阻塞一切,这就是它的重点) - 但 Fiber 只是另一种类型的线程,所以无论您使用它们来执行阻塞还是非阻塞 IO 完全是给你。
    猜你喜欢
    • 2019-03-20
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2018-06-10
    • 2017-11-15
    • 2019-01-07
    相关资源
    最近更新 更多