文章目录
- 初识Reactive Stream
- Reactive Stream主要接口
初识Reactive Stream
Reactive Stream(响应流)是java9引入的一套标准,是基于发布/订阅模式的数据处理规范。
响应流作为提供 非阻塞背压 的异步流处理标准的倡议,它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅着,而不需要发布者阻塞,或者不需要订阅着有限制的缓冲区或丢弃。
理解Reactive Stream,一个概念很关键,背压。什么叫背压?
首先异步消费者会向生产者订阅接受消息,然后当有新的消息可用时,消费者会通过之前订阅时提供的回调函数被再次激活调用。如果生产者发出的信息比消费者能够处理消息的最大亮还多,消费者可能一直被迫地在抓消息,耗费越来越多的资源,埋下了潜在的崩溃隐患。为了防止这一点,需要有一种机制使消费者可以通知生产者来降低消息生成的速度。
打个比方,就像水龙头一样,消费者这边可以控制水流的增加减少和关闭。
Reactive Stream主要接口
Java9通过java.util.concurrent.Flow和java.util.concurrent.SubmissionPublisher类来实现响应式流。
Reactive Stream的主要接口声明都在Flow类里:
- Publisher:数据项发布者、生产者。
- Subscriber:数据项订阅者、消费者。
- Subscription:发布者与订阅着之间的关系纽带,订阅令牌。
- Processor:数据处理器(发布者和订阅者的中转站,非必要)。
下图显示了发布者和订阅者之间的典型交互顺序。 订阅令牌未显示在图表中。 该图没有显示错误和取消事件。
处理者(processor)充当订阅者和发布者的处理阶段。 Processor接口继承了Publisher和Subscriber接口。 它用于转换发布者——订阅者管道中的元素。 Processor<T,R>订阅类型T的数据元素,接收并转换为类型R的数据,并发布变换后的数据。 下图显示了处理者在发布者——订阅和管道中作为转换器的作用。 可以拥有多个处理者。