Reactive Streams规范及常见库
一、什么是Reactive Streams
Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.
概括的說,Reactive Streams是個規范,它規范了“有非阻塞背壓機制的異步的流處理”。實際上Reactive Streams規范或者說它的第三方代碼實現包含的內容更加豐富:除了non-blocking,還有:Composable、Deferred、Flow、Controll、Resilient、Interruptible。
其中Composable就是函數式編程思想的用武之地。 可體會下Java8里的Stream API各種算子的參數,所以Lamda表達式是進行Reactive Streams實現的基本前提,否則很難想象臃腫的面向對象的Composable。有了JDK8的鋪墊,Reactive Streams接口被JDK9定義在Flow里才是可能的。
As of August 23rd, 2019 we have released version 1.0.3 of Reactive Streams for the JVM, including Java API, a textual Specification, a TCK and implementation examples.
這個規范由三部分組成:Java API(org.reactive-streams)、以文字描述的規范、技術兼容工具包。Reactive Streams 規范 僅限于 Java(JavaScript、網絡協議)世界,其它語言雖然也有 Reactive 這樣的工具(參考這里:ReactiveX)實現,但好像沒有類似的規范。
二、為什么要有 Reactive Streams
因為很多廠商開發了 reactive 庫,但是它們直接很難/不可能互操作。用 Reactive Streams 進行規范就使得它們可以互操作,也就讓它們串起來形成一個 reactive 鏈成為了可能。
三、為什么要用 Reactive
因為 reactive 可以榨干 CPU…,所以從老板的角度講是省錢、從環保的角度講是省電、從碼農的角度講是有意思。
四、Java 世界里知名的 Reactive 庫
從 Reactive 宣言、到 Reactive Streams 規范,再到各種 Reactive 庫是很自然的一個脈絡。但現實是大家先有了 Reactive 系統的思想,聰明的程序開發出各種蘊含著 reactive 思想的庫(比如 RxJava 1.0)。為了各個庫之間的統一性、可操作性,大家一起協商出了 Reactive Streams 規范。繼而這些已經存在的 reactive 庫便改進自己的 API 設計,向 reactive streams 規范靠攏并提供各種轉化 api 讓用戶在原生 api 和 reactive streams 接口直接轉換。比如 RxJava 2.0 的 Flowable 就直接繼承自 org.reactive-streams.Publisher 并提供了 toObservable() toFlowable()。因為各個庫的實現細節不同,用到具體轉換 api 需要參考其手冊。
RxJava雖然是java ractive編程的領路人,并且RxJava跟Project Reactor 3.0 基本是等價的。但是考慮到Spring生態的強大,估計其前途不會太光明了。
這個規范被的 API 形式定義從 JDK 9 這個版本開始,以 java.util.concurrent.Flow 靜態子類的形式被定義。其實,既然已經有了 org.reactive-streams 這樣的規范,為什么還要在 JDK 中弄出個 Flow 來再重新定義一次。難道就是要宣示 JDK 自身有支持 reactive streams 的東西?這個思路的本意應該就像 JDBC 接口一樣,讓 Flow 里定義的接口成為 SPI,讓不同供應商的 reactive sreams 可互操作吧。所以 JDK 里的 Flow 中定義的東西不能算是庫,而是個 SPI:Service Provider Interface。
這些都做了改進以符合 org.reactive-streams 中的 API 定義。其中Vert.x不僅提供了對 java 的 reactive 庫,還有 JavaScritp、Ruby、Scala 等。
https://projectreactor.io/docs/core/release/reference/
-
既然 Spring 都提供了對 Reactive Streams 的實現,感覺其實上面列出的幾個庫已經沒有太多的意義。各家對Reactive Streams規范的實現在細節上都有很大不同,因為Spring 的生態太強大了,如果沒有特殊的需求,比如 JDK 小于 8,那么我們的項目基本于 Project Reactor,那么應該是較好的選擇。這個網頁 https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro 可以幫助操練 Reactor Api。
-
Project Reactor 到目前為止經歷了 1.0, 2.0, 3.3。其中 1.0 這個階段還沒有 Reactive Stream 是規范。在 2.0 開始 follow 規范并基本定型。3.0 感覺是個重構版,形成 reactive-streams-commons 庫。這里是 3.0 的 release 文檔: https://github.com/reactor/reactor-core/releases?after=v3.0.0.RELEASE
-
有了 Project Reactor 這樣的基礎庫,整個 Spring 組件基本都有了 Reactive Style 的版本,在這個基礎上用 Netty(或 Servet 3.1 Containe)+ Reactive Streams 適配層 + Spring Security Reactive + WebFlux + Spring Data Reactive Repository,就可以構建出重頭到尾的 Reactive 應用。
-
從 Spring Cloud 的組件角度講,也衍生出 Reactive Discovery Client, Reactive Load Balancer, Blockhound, Reactor Debug, Improved Reactor Micrometer Support, Reactor Netty Metric …
-
Stephane 是實現Project Reactor的主力,下面是他的兩個視頻鏈接:
https://www.youtube.com/watch?v=Tr04KiJdAXQ
https://www.youtube.com/watch?v=zls8ZLry68M
Akka Stream:https://doc.akka.io/docs/akka/current/stream/stream-introduction.html
文章轉自
總結
以上是生活随笔為你收集整理的Reactive Streams规范及常见库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网日报 | 新东方二次上市通过港交所
- 下一篇: 数字化时代在线教育行业营销解决方案