Java响应式编程
提纲
1、响应式编程Reactive Programming
2、Reactive Streams
3、Reactor和RxJava
4、JDK原生异步编程与Reactive Streams的关系
1、响应式编程Reactive Programming
为了解决异步编程中出现的各种问题,程序员们提出了各种的方法和手段去解决这些问题,这些方法和手段就被称为Reactive Programming。
Reactive Programming是一种编程思想,类似于面向对象,函数式编程,也就说采用响应式编程思想写程序,就是响应式编程。
响应式编程的本质就是对数据流或某种变化做出反应,但是这个变化什么时候被触发是未知的。
从响应式编程的本质来看,它是一种异步的数据处理方式,所以肯定是采用回调的方式在处理数据的变化。
2、响应式流Reactive Streams
当越来越多的程序员,开始使用响应式编程思想来编写处理数据流的程序时,就需要一些专家来统一一响应式编程思想,形成响应式编程的规范和标准。
在这样的背景下,国外的Netflix、Pivotal、Lightbend这3家公司联合起来启动了Reactive Steams项目。Reactive Streams项目是为以响应式编程思想编写异步流数据处理程序制定一套标准和规范。
因为响应式编程思想用来编写处理流数据stream的程序,所以这样的程序就叫响应式流Reactive Streams。
所以,Reactive Steams,翻译成中文就是反应式流或者响应式流,其实是一套标准和规范,目的是为使用响应式思想编写流数据处理程序提供一套规范和标准。
3、Reactor和RxJava
既然制定了针对响应流的标准,那么就要提供实现标准的软件产品。
基于Reactive Streams规范的实现很多,Java领域的第三方库Reactor和RxJava就是最著名实现了Reactive Streams规范的软件产品。
因此,Reactive Streams与RxJava和Reactor的关系,就类似于Java语言规范(Java language Specification)与JDK的关系一样,前者是标准和规范,后者是实现了前者的软件产品。
Reactor和RxJava是Java社区实现的Reactive Streams框架,而Java官方也在JDK9中引入了实现Reactive Streams规范的Flow类,它是由著名Java专家Doug Lee编写的。
4、JDK原生异步编程与Reactive Streams的关系
Reactive Programming是一种异步编程方式,采用Reactive Programming就是为了实现异步处理任务。
JDK原生对异步编程有支持,其实在JDK8中,Java已经对异步编程有了支持。jdk8中引入了CompletableFuture,通过CompletableFuture我们可以将大量的异步任务做好编排。但是在JDK8中的CompletableFuture依然有很多特性无法支撑。所以在JDK9,CompletableFuture做了增强功能,比如支持延迟,超时,子类化之类功能。这时,其实CompletableFuture已经可以去支撑做一些异步编程的操作了。
但是CompletableFuture并不是真正的基于Reactive Steams去实现的。
首先,CompletableFuture无法处理Reactive Steams中的一个核心概念back pressure。back pressure,可以翻译为背压、反压、回压,比如在上下游负载处理能力不同时,比如下游负载过重无法处理过来时,就需要告知上游采取一些策略去限制流向下游的负载。CompletableFuture明显无法提供这种背压通知机制。
其次,Java中提供的回调,Future机制在实现响应式编程中,问题和缺点都比较难规避。有个比较出名的概念叫做callback hell(回调地狱)。简单来说就是回调里面套回调,虽然将子过程做到解耦,但是随着业务变得复杂,回调代码的复杂性就大大的增加,这个就是回调地狱。
Reactive Streams面向的是Stream。Java中的Stream API有点类似于Reactive Steams,但是Stream API是同步阻塞的,而Reactive Streams是异步非阻塞的。
但是为什么很多大公司在jdk提供了异步编程支持的情况下,依然还是使用RxJava,Reactor这种第三方依赖库做异步编程呢?
问题在于,大多数的时候,咱们采用异步编程处理的任务并不是非常复杂的。这个时候,咱们确实不需要去使用Reactive Steams反应流的框架。但是,如果系统越来越复杂,或者你处理的业务本身极其复杂,你就要去写一些让人头皮发麻的代码了。随着时间的推移,这种代码会变成非常难以维护。
参考资料:
1、https://blog.csdn.net/jbjmh/article/details/136823495
2、https://blog.csdn.net/Zong_0915/article/details/115027810
3、https://zyfcodes.blog.csdn.net/article/details/130457788?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6-130457788-blog-136823495.235^v43^pc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6-130457788-blog-136823495.235^v43^pc_blog_bottom_relevance_base4&utm_relevant_index=13
4、https://juejin.cn/post/6844903662007894030