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 是个(Java 世界里的)规范,它规范了“有非阻塞背压机制的异步的流处理”。挺简单的定义,但是能够真正正确理解异步、非阻塞并不容易,以后单独开写一篇。实际上 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 库

RxJava

从 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 需要参考其手册。

JDK

这个规范被的 API 形式定义从 JDK 9 这个版本开始,以 java.util.concurrent.Flow 静态子类的形式被定义。其实,既然已经有了 org.reactive-streams 这样的规范,为什么还要在 JDK 中弄出个 Flow 来再重新定义一次。难道就是要宣示 JDK 自身有支持 reactive streaming 的东西?这个思路的本意应该就像 JDBC 接口一样,让 Flow 里定义的接口成为 SPI,让不同的 reactive sreams 库供应商可互操作吧。所以 JDK 里的 Flow 中定义的东西不能算是库,而是个 SPI:Service Provider Interface。

Vert.x、MongoDB 响应式流驱动

这些都做了改进以符合 org.reactive-streams 中的 API 定义。其中Vert.x不仅提供了对 java 的 reactive 库,还有 JavaScritp、Ruby、Scala 等。

Spring 的 Project Reactor

Project Reactor 主页: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

其它编程语言的 Reative 库

其它编程语言的 Reative 库可参考:https://github.com/ReactiveX
另,Akka Stream:https://doc.akka.io/docs/akka/current/stream/stream-introduction.html

Reference:
https://www.reactive-streams.org/
https://www.youtube.com/watch?v=Cj4foJzPF80&list=PLVoESeXbuo-yWN1HW5g45v6eGEPOcfWU0&index=4&t=2940s