首页 > 解决方案 > 经典与反应式方法中的连接、请求和线程

问题描述

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

没反应

  1. 创建来自浏览器的连接。
  2. 对于来自线程池的每个请求线程,都会对其进行处理。
  3. 线程完成处理后,通过连接将结果返回给另一端。

反应性???

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

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

标签: multithreadingtomcatnettyspring-webfluxreactive

解决方案


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

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

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

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

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

网上几张图片可以帮助你理解:->在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述


推荐阅读