阻塞 http 调用期间的反应式编程基础知识

aya*_*dov 5 vert.x reactivex spring-webflux

作为一个新近研究反应式编程的人,我有一个问题似乎在其他地方没有得到解答:

阻塞调用(即来自前端的http请求)如何真正利用这个概念?

我的理解是这样的,问题是如果有误请纠正:

  1. 前端用户单击按钮并进行 ajax 调用。
  2. 然后浏览器发出常规的http请求
  3. 那么反应式后端本质上仍然是一个阻塞服务器。这样,在整个事情完成之前不会提供 http 响应
  4. 响应式本质就在这里,它不是在 1 个线程中处理来自前端的 1 个请求,而是使用更少的线程,通过保存何时执行什么的回调。利用库 API 以某种方式管理这种复杂性。
  5. 归根结底,我们从前端进行的 http 调用仍然是一个阻塞调用。与基于线程的并发不同的是,我们将阻塞调用委托给其他线程(实际上,为什么使用的线程更少?),例如数据库调用、外部 Rest 调用等。最后,我们阻塞等待直到全部完成。

这些假设正确吗?

进一步来说,是的,基本理解是正确的,是什么使得这种方法更适合基于线程的方法?

假设在我的例子中,预期的并发用户并不是那么大,同时达到前 500 人。

inj*_*eer 2

您的假设总体上是正确的。这就是几乎任何相当现代的网络应用程序(无论是 vertx、micronaut 还是 spring-boot+)的工作原理。

如果用户希望请求是同步的(意味着他正在等待直到完成),那么服务器必须以阻塞方式执行它,但不能阻塞自身,以便其他用户也可以并行触发他们的请求。

响应式本身就是构建代码的方式,即在 RxJava 中,您使用方法链而不是回调(地狱),但它通常不会改变请求处理的性质。