经典与反应式方法中的连接、请求和线程

Connection, Request and Thread in classical vs reactive approach

我正在研究反应性的含义,因为与常见的非反应性方法相比,它是一种低级差异,我想了解发生了什么。我们以Tomcat作为服务器(估计netty会不一样)

无反应

  1. 来自浏览器的连接已创建。
  2. 从线程池获取每个请求线程,线程池将对其进行处理。
  3. 线程完成处理后,returns将结果通过连接传回另一端。

被动???

Tomcat 或 Netty 是如何完成的。我找不到任何关于 Tomcat 如何支持响应式应用程序以及 Netty 如何以不同方式做到这一点的文章(连接、线程、请求级别解释)

令我困扰的是,当您仍然需要等待响应时,如何使网络服务器解除阻塞。您可以通过反应式更快地获得响应的第一部分,但这就是全部吗?我想反应性的要点是有效的线程利用率,这就是我要问的问题。

你的最后一点:“我想反应性的主要观点是有效的线程利用,这就是我要问的问题。”,正是反应性方法的设计目的。

那么有效利用率是如何实现的呢?

好吧,举个例子,假设您多次从服务器请求数据。

在典型的非反应性方式中,您将为每个请求提供 creating/using 多个线程(可能来自线程池)。一个特定线程的工作只是服务于该特定请求。线程将接受请求,将其交给服务器并等待其响应,直到从服务器获取数据,然后将该数据返回给客户端。

现在,以Reactive的方式,一旦有请求,就会为其分配一个线程。现在,如果出现另一个请求,则不会创建另一个线程,而是由同一个线程提供服务。如何? 当线程向服务器发出请求时,它不会等待服务器的任何立即响应,而是返回并处理其他请求。 现在,当服务器搜索数据并且服务器可用时,将引发一个事件,然后线程将去获取该数据。这称为事件循环机制,因为当数据可用时调用线程的所有工作都是通过调用事件来实现的。 现在,它分配了复杂性来映射对请求的准确响应。 而所有这些复杂性都被Spring-Webflux(在Java中)抽象出来了。 所以整个过程变得非阻塞。由于只有一个线程足以满足所有请求,因此不会有线程切换,我们可以为每个 CPU 核心配备一个线程。从而实现线程的有效利用。

网络上的一些图片可以帮助您理解:->