一文读懂响应式编程到底是什么?( 二 )
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 。
- 当初|这是我的第一部华为手机,当初花6799元买的,现在“一文不值”?
- 读懂|一图读懂冷链食品物流防控
- 读懂|【招商动态】40万亿“新基建”招商:100页PPT读懂新基建的新机遇!
- 技术|一文看懂网络切片:是时候表演 5G 真正的技术了
- 一文搞懂GO语言值类型与引用类型的区别
- 数字化|一文读懂,门店如何靠数字化高速精准获客?
- 微软研究院展示屏幕倾斜响应式应用技术
- 点点滴滴学5G——一文深入掌握 NR SIB1的基本原理
- “一站式”服务打造金字招牌,一图读懂佛高区顺德园行政服务中心
- 电商业账务处理流程:全网最全!一文精通!原来刷单竟这样做账
