一、响应式编程
JDK 9 Flow 是JDK对Reactive Stream (响应式流/反应流) 的实现,Reactive Stream是一套基于发布/订阅模式的数据处理规范。响应式流从2013年开始,作为提供非阻塞背压的异步流处理标准的倡议。 它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅者,而不需要发布者阻塞,或订阅者需要有无限制的缓冲区或丢弃。更确切地说,Reactive流目的是“找到最小的一组接口,方法和协议,用来描述必要的操作和实体以实现这样的目标:以非阻塞背压方式实现数据的异步流”。
反应式流 (Reactive Stream) 规范诞生,定义了如下四个接口:
Subscription 接口定义了连接发布者和订阅者的方法
Publisher 接口定义了发布者的方法
Subscriber 接口定义了订阅者的方法
Processor<T,R> 接口定义了处理器
Reactive Stream 规范诞生后,RxJava 从 RxJava 2 开始实现 Reactive Stream 规范 , 同时 Spring提供的Reactor 框架(WebFlux的基础) 等也相继实现了 Reactive Stream 规范。
下图展示了订阅者和发布者之间的交互:
下面解释下前面提到了背压:如果生产者发出的信息比消费者能够处理消息最大量还要多,消费者可能会被迫一直在抓消息,耗费越来越多的资源,埋下潜在的崩溃风险。为了防止这一点,需要有一种机制使消费者可以通知生产者,降低消息的生成速度。生产者可以采用多种策略来实现这一要求,这种机制称为背压。
二、JDK 9 的Flow和JDK 8中的Stream的关系
从名字来说,二者都有流的含义,但其实二者并不是同一个概念:
Flow API会在网络通信方面(请求,减速,丢弃,阻塞等);
Streams API非常适合处理数据流(map,reduce和所有变体)。
三、JDK 9 的Flow和Spring Reactor的关系
二者都是Reactive Streams 规范的实现:
Java 9 Flow 是JDK的实现;
Reactor 框架(Web Flux的基础)是Spring的实现。