Spring Reactive Web Framework客户端

时间:2017-10-09 09:18:59

标签: spring reactive-programming spring-webflux

我正在尝试使用反应式网络框架。我对如何运作有一定的疑问。

在典型的应用程序中,我们有数据存储区(Relational或No SQL)。 应用层(Controllers)连接存储并获取数据。 客户层(调用您的API端点)并获取数据。

据我所知,Vendors.Only Mongo并没有发布异步或被动驱动程序,可能是Cassandra有反应驱动因素。 控制器层将使用Mono或Flux或Single来回传数据。

客户端层将消耗此数据。

由于HTTP本质上是同步的,因此客户端层或应用程序将如何从Spring中的反应性支持中受益。

问题:让我们说我在我的Flux响应中有10条JSON记录。这意味着,我的客户端将获取流中的数据或整个数据集将首先在客户端获取,然后消费它的过程将是在当前,我们有 InputStream 作为服务调用的响应,由于HTTP协议的设计,它本质上是阻塞的。

问题:对于典型的Web应用程序来说,有一个反应性架构是否有意义,当我们将获得响应的非常媒介是阻止自然。

Spring Web Reactive使用Servlet 3.1非阻塞I / O并在Servlet 3.1容器上运行。它还可以运行在非Servlet运行时,例如Netty和Undertow。每个运行时都适用于一组共享的,响应式的ServerHttpRequest和ServerHttpResponse抽象,这些抽象将请求和响应主体公开为Flux,在读取和写入方面具有完全背压支持。

来源: https://docs.spring.io/spring-framework/docs/5.0.0.M1/spring-framework-reference/html/web-reactive.html

1 个答案:

答案 0 :(得分:1)

数据存储供应商和OSS社区正在努力解决这个问题。已经在Spring Data Kay中支持Cassandra,Couchbase,MongoDB和Redis。

我认为您正在混淆HTTP协议本身和阻止Java API。您没有在一个大块中获得完整的HTTP请求或响应,因此HTTP协议不是同步的。您选择的基础网络库也可以在阻塞或非阻塞I / O之间进行选择。

现在关于您的HTTP客户端问题:如果您正在使用WebClient,则返回的Flux会在它们可用时立即发出元素。底层库尽快读取和解码消息,同时仍然尊重背压。

我不确定我是否收到了您的上一个问题 - 但如果您想知道何时以及为何应该使用被动方法:如果您已经考虑到可扩展性/效率,这种方法会带来好处问题,或者您的应用程序是否与许多外部服务进行通信,然后对延迟敏感。请参阅the Spring Framework 5.0 FAQ中的详情。