【问题标题】:Spring Reactor WebClient how does it achieve non-blocking?Spring Reactor WebClient 是如何实现非阻塞的?
【发布时间】:2018-08-15 03:39:42
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

这里有几个单独的问题。

  • 如何管理 I/O 操作?
  • 这个运行时背后的线程模型是什么?
  • 应用程序如何处理 HTTP 背后的请求/响应模型?

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

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

有关这方面的更多信息,请查看the reactive programming introduction in the Reactor reference documentationthis talk given by Rossen Stoyanchev that explains things well if you're used to the typical Servlet container model

【讨论】:

  • 由于我对 Java NIO 的理解有限,我是否正确(从概念上而非严格技术上)说将打开一些 SocketChannel 并使用 Selector 注册,然后由旋转的事件循环管理无限地监听选择器从这些通道接收事件,然后在通道发出事件时做出反应(调用实际代码等待响应)?
  • 听起来不错。请注意,WebClient 可以支持其他 http 客户端库,因此运行时模型可能会有所不同。
猜你喜欢
  • 2019-09-20
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2018-11-12
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多