什么是响应式编程?
响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。
什么是响应式流?
具备“异步非阻塞”特性和“流量控制”能力的数据流,我们称之为响应式流(Reactive Stream)。
响应式出现得原因
异步非阻塞
在如今互联网时代的大背景下,Web应用通常要面对高并发、海量数据的挑战,性能从来都是必须要考量的核心因素。
从调用者和服务提供者的角度来看,阻塞、非阻塞以及同步、异步可以这么理解:
阻塞和非阻塞反映的是调用者的状态,当调用者调用了服务提供者的方法后,如果一直在等待结果返回,否则无法执行后续的操作,那就是阻塞状态;如果调用之后直接返回,从而可以继续执行后续的操作,那可以理解为非阻塞的。
同步和异步反映的是服务提供者的能力,当调用者调用了服务提供者的方法后,如果服务提供者能够立马返回,并在处理完成后通过某种方式通知到调用者,那可以理解为异步的;否则,如果只是在处理完成后才返回,或者需要调用者再去主动查询处理是否完成,就可以理解为是同步的。
举个例子,老刘买了个洗衣机,当他启动了洗衣机后如果一直在等待洗衣机工作结束好晾衣服,那他就是阻塞的;如果他启动洗衣机之后就去看电视了,估摸快洗完了就时不时来看看,那他就是非阻塞的,因为老刘可以去做另一件事。但老刘不能知道这洗衣机啥时候洗完/是否洗完,那么这台洗衣机就是同步方式工作的;老刘后来换了一台可以在洗完衣服播放音乐的洗衣机,这样就不用时不时来看了,虽然启动之后洗衣机不能立刻返回给老刘干净的衣服,但是可以在工作完成之后通知在看电视的老刘,所以新的洗衣机就是异步工作的。
在当前网络背景下,需要提高性能。方式有以下两种:
并行化:使用更多的线程和硬件资源;----->催生出了多线程编程
异步化:基于现有的资源来提高执行效率。 ------>催生出了响应式流
响应式需要解决得一个问题-流量控制
采用方式:回压
在响应式流中,数据流的发出者叫做Publisher,监听者叫做Subscriber。订阅者也需要有一种能够向上游反馈流量需求的机制。这种能够向上游反馈流量请求的机制就叫做回压
基本策略:
1.缓存策略:由于发布者的数据不能很快被订阅者处理掉,那么发布者会将未处理的数据元素缓存起来
2.丢弃策略:发布者不需要缓存来不及处理的数据,而是直接丢弃,当订阅者请求数据的时候,会拿到发布者那里最近的一个数据元素
从此,便出现了如下得响应式编程:
响应式流(异步非阻塞+背压机制)+ 变化传递 + 声明式范式
关于labmda与响应式编程的区别?
函数响应式编程的重点在于“函数式”的语言特性,这个概念在二十年前就盖棺定论了。
响应式编程的重点在于“基于事件流”的异步编程范式,由不断产生的数据/时间来推动逻辑的执行。