当前位置: 首页 > 知识库问答 >
问题:

Spring Reactor WebClient如何实现无阻塞?

蒋泰
2023-03-14

基本问题:Spring反应器WebClient如何实现非阻塞时,与RestTem板相比?在将请求发送到外部服务(例如)后,它是否必须在某个地方阻塞?HTTP本质上是同步的,对吗?所以调用应用程序必须等待响应?线程如何知道上下文,以便对来自服务的响应做出反应?

共有1个答案

乐正烨熠
2023-03-14

这里有几个独立的问题。

  • 如何管理I/O操作

WebClient和project Reactor的情况下,Netty事件循环用于排队/调度/处理事件。每个读/写操作都是以非阻塞方式完成的,这意味着没有线程等待I/O操作完成。在这个模型中,并发不是通过线程池实现的,但是有少量线程处理工作单元,这些线程永远不会阻塞。

从纯HTTP的角度来看(例如,如果您在网络上捕获HTTP数据包),您不会看到RestTem板WebClient调用之间有什么大的区别。HTTP传输本身不支持背压概念。所以客户端仍然需要等待响应——这里的不同之处在于,使用该WebClient的应用程序不会浪费资源等待该操作完成——它将使用这些资源来处理其他事件。

有关这方面的更多信息,请查看Reactor参考文档中的reactive编程介绍,以及Rossen Stoyanchev提供的这篇演讲,如果您习惯了典型的Servlet容器模型,它将很好地解释问题。

 类似资料:
  • 问题内容: 我正在为密集型网络应用程序实现无锁的单一生产者单一使用者队列。我有一堆工作线程在各自独立的队列中接收工作,然后它们将出队并进行处理。 从这些队列中删除锁可以极大地提高高负载下的性能, 但是当队列为空时它们不再阻塞 ,从而导致CPU使用率猛增。 我如何有效地使线程阻塞,直到它可以成功出队或被杀死/中断? 问题答案: 如果您使用的是Linux,请考虑使用Futex。它通过使用原子操作而不是

  • 问题内容: 考虑以下代码: 我了解在上面的代码中,如果拥有同步块的所有权,并且同时如果线程尝试获取同步块,则需要内核等待。我想避免这种情况,并在块之前旋转,直到调用等待并离开该块的所有权为止。那可能吗? 问题答案: JVM无需将进入锁定的同步块的步骤实现为硬块和上下文切换。它可以选择使用重量更轻的方法,例如旋转锁。实际上,Oracle JVM竭尽所能避免阻塞。因此,您可能会发现JVM已经为您完成了

  • Java Future对象用于获取由并行线程(执行器)执行的异步计算的结果。我们调用Future.get()方法并等待结果就绪。此示例显示了一种从Future检索结果的非阻塞方式。java实现java非阻塞未来。 在本例中,在并行执行完成后调用onSuccess()方法。问题在于onSuccess()方法未在主线程上运行。我想在主线程上执行onSuccess()方法。我怎样才能解决这个问题。谢谢

  • 问题内容: 如何在Java中实现jpeg-lossess? 会抛出异常: 该只打印。 使用(版本1.1.3): 还抛出异常: 你能写个样本吗? 问题答案: 标准Java没有JPEG-LS的压缩类型。 您可以下载并使用JAI(Java高级映像)API,尽管我相信它包括这样的压缩类型。 可以从这里下载

  • 本文向大家介绍nodejs中实现阻塞实例,包括了nodejs中实现阻塞实例的使用技巧和注意事项,需要的朋友参考一下 node.js中与生俱来的单线程编程、回调函数异步式风格让我们有时喜有时忧。先说单线程,很多人会费解于node.js的单线程如何能做到高并发?这个问题不是本文重点,点到为止。澄清一点,node.js的单线程仅仅指javascript引擎是单线程的,无论如何我们没有办法在javascr

  • 我是新进入Vert. x的。我遵循了Vert. x文档和一些教程。但是我混淆了使用Vert. x实现非阻塞REST Web服务的正确方法是什么。我在Java中找到了这篇文章开发非阻塞Web应用程序,其中包含一个使用Vert. x实现非阻塞Web应用程序的示例。 此代码块包含向另一个Vertical(“todoService”:TodoServiceVerticle)发送消息。 这是“todoSer