2017-10-09 52 views
0

我正在嘗試使用反應式web框架。我對於它如何工作有一定的疑問。Spring反應式Web框架客戶端

在典型的應用程序中,我們有數據存儲(Relational or No SQL)。 應用層(控制器)連接以存儲和獲取數據。 客戶端層(調用您的API端點)並獲取數據。

據我所知,沒有異步或反應驅動程序發佈Vendors.Only蒙戈和可能是卡桑德拉反應驅動程序)。 控制器層將使用單聲道或通量或單通道回傳數據。

客戶端層將使用此數據。

由於HTTP本質上是同步的,客戶層或應用程序如何從Spring中的反應式支持中受益。

問題:讓我們說在JSON中有10條記錄來自我的Flux響應。這意味着,我的客戶端將獲得數據流還是整個數據集將首先在客戶端獲取,然後消耗它的過程將會在本質上是反應性的。目前,我們有InputStream作爲服務調用的響應,由於HTTP協議的設計,它本質上是阻塞的。

問題:當典型的Web應用程序具有反應式體系結構時,如果我們要獲得響應的非常中等的程度是Blocking in Nature,那麼它是否有意義。

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

數據存儲廠商和OSS社區正在研究這一點。 Spring Data Kay已經支持Cassandra,Couchbase,MongoDB和Redis。

我認爲你在混合HTTP協議本身和阻塞Java API。您沒有在一個大塊中獲得完整的HTTP請求或響應,所以HTTP協議不是同步的。您選擇的底層網絡庫也驅動阻塞或非阻塞I/O之間的選擇。

現在關於您的HTTP客戶端問題:如果您使用的是WebClient,則返回的Flux會在元素可用時立即發出元素。底層庫儘可能快地讀取和解碼消息,同時仍尊重背壓。

我不確定我是否會收到最後一個問題 - 但是如果您想知道什麼時候以及爲什麼要使用被動方法:如果您已經遇到可伸縮性/效率問題,應用程序正在與許多外部服務進行通信,然後對延遲敏感。在the Spring Framework 5.0 FAQ中查看更多內容。