02
如何理解响应式编程中的背压
背压,由Back Pressure 翻译得到,从英文字面意思讲,称之为回压可能更合适 。首先解释一下回压,它就好比用吸管喝饮料,将吸管内的气体吸掉,吸管内形成低压,进而形成饮料至吸管方向的吸力,此吸力将饮料吸进人嘴里 。我们常说人往高处走,水往低处流,水之所以会出现这种现象,其实是重力所致 。而现在吸管下方的水上升进入人的口中,说明出现了下游指向上游的逆向压力,而且这个逆向压力大于重力,可以称这种情况为背压 。这是一个很直观的词,向后的、往回的压力——Back Pressure 。
放在程序中,也就是在数据流从上游源生产者向下游消费者传输的过程中,若上游源生产速度大于下游消费者消费速度,那么可以将下游想象成一个容器,它处理不了这些数据,然后数据就会从容器中溢出,也就出现了类似于吸管例子中的情况 。现在,我们要做的事情就是为这个场景提供解决方案,该解决方案被称为背压机制 。
为了更好地解决背压带来的问题,我们回到现实中看一个事物——大坝 。在发洪水期间,下游没办法一下子消耗那么多水,大坝此时的作用就是拦截洪水,并根据下游的消耗情况酌情排放,也就是说,背压机制应该放在连接元素生产者和消费者的地方,即它是生产者和消费者的衔接者 。然后,根据上面对大坝的描述,背压机制应该具有承载元素的能力,也就是它必须是一个容器,而且其存储与下发的元素应该有先后顺序,那么这里使用队列是最适合的了 。背压机制仅起承载作用是不够的,正因为上游进行了承压,所以下游可以按需请求元素,也可以在中间根据实际情况进行限流,以此上下游共同实现了背压机制 。在本书后续内容及相关的配套视频中会介绍背压的相关API 。
03
Reactor 与RxJava 的对比
关于响应式编程,我写的《Java 编程方法论:响应式RxJava 与代码设计实战》一书已经出版,那么Reactor 与RxJava 又有什么区别呢?首先我要明确地告诉你,如果你使用的是Java 8+,那么推荐使用Reactor 3,而如果你使用的还是Java 6+或函数需要做异常检查,那么推荐使用RxJava 2 。

文章插图
从上图可以看到,RxJava 2 和Reactor 共用了一套接口API 标准Reactive Streams Commons,这也说明它们的最终目的是一致的,而且API 具有通用性,这样也降低了学习成本 。
下面再来回顾一下RxJava 。
迄今为止,RxJava 发行版主要分三大版本RxJava 3、RxJava 2 和RxJava 1 。与RxJava 1 不同,RxJava 3、RxJava 2 直接通过新添加的Flowable 类型来实现Publisher 的接口定义(RxJava 3 与RxJava 2 并没有太多区别,故这里只介绍RxJava 2) 。同时,RxJava 2 依然保留了RxJava 1 中的Observable、Completable 和Single,并引入了支持Optional 的Single 升级版——Maybe 类型 。RxJava 1 中的Observable 不支持RxJava 2 中的背压机制,背压机制是Flowable 的专有功能,不过Observable 内部提供了可转换API 。需要注意的是,Observable 实现的是RxJava 2 中自定义的ObservableSource 接口 。
在Reactor 中,可以发现Mono 和Flux 两种类型都实现了Publisher 接口,同时两者皆实现了背压机制 。Flux 可以对标RxJava 2 中的Flowable 类型,而Mono 可以被理解为RxJava 2 中对Single 的背压加强版 。后续,我们会进行更深入的讲解 。
同样,下面再来了解一下Reactor 与RxJava 的不同之处 。
- 为了兼容 Java 1.6+ ,RxJava 不得不自行定义了一些函数式接口,可以参考io.reactivex.functions 下的接口定义 。而Reactor 3 则是基于JDK 中提供的java.util.function 来设计实现的 。
- 可以很轻松地从java.util.stream.Stream 转换为Flux,也可以很轻松地由后者转换为前者 。
- 同样,可以很轻松地实现CompletableFuture 与Mono 之间的互相转换,也可以轻松而安全地基于Optional 类型的元素创建Mono 。
- Reactor 3 可以更好地服务于Spring Framework 5,也更适应最新版本的JDK 。
Core 是我们主要研究的库,是Reactor 的核心实现库 。其作用与RxJava 2 的核心实现的作用是一样的,本书主要介绍reactor-core 模块 。
【一文读懂响应式编程到底是什么?】IPC 可以认为它是针对encode、decode、send(unicast、multicast 或request/response )及服务连接而设计的支持背压的组件 。IPC 支持Kafka、Netty 及Aeron 。
Addons 其中包括reactor-adapter、reactor-logback 和reactor-extra 。reactor-adapter 可以说是连接RxJava 1/2 中Observable、Completable、Flowable、Single、Maybe、Scheduler 的桥梁,可以方便地与Reactor 3 进行转换操作 。同样,这个库对于Swing/SWT Scheduler、Akka Scheduler 也做了针对性适配 。reactor-logback 用于支持Reactor Core 异步处理Logback 方面的功能 。reactor-extra 为数字类型的Flux 源提供了很多数学运算的操作 。
推荐阅读
- 一文带你了解Notta是什么
- CPU越来越热吗 一文带你看懂怎么选
- 一文搞懂 Traefik2.1 的使用
- 从一个HTTP请求来读懂HTTP、TCP协议
- 一文读懂 Java操作Elasticsearch
- 4月16日新闻早讯,每天60秒读懂世界
- 一文讲透FTP和SFTP的区别
- 一文搞懂分类算法中常用的评估指标
- 一文了解高并发限流算法
- 一文领略 HTTP 的前世今生
