响应式编程

什么是响应式编程?

响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。

什么是响应式流?

具备“异步非阻塞”特性和“流量控制”能力的数据流,我们称之为响应式流(Reactive Stream)。

响应式出现得原因

异步非阻塞

在如今互联网时代的大背景下,Web应用通常要面对高并发、海量数据的挑战,性能从来都是必须要考量的核心因素。

从调用者和服务提供者的角度来看,阻塞、非阻塞以及同步、异步可以这么理解:
阻塞和非阻塞反映的是调用者的状态,当调用者调用了服务提供者的方法后,如果一直在等待结果返回,否则无法执行后续的操作,那就是阻塞状态;如果调用之后直接返回,从而可以继续执行后续的操作,那可以理解为非阻塞的。
同步和异步反映的是服务提供者的能力,当调用者调用了服务提供者的方法后,如果服务提供者能够立马返回,并在处理完成后通过某种方式通知到调用者,那可以理解为异步的;否则,如果只是在处理完成后才返回,或者需要调用者再去主动查询处理是否完成,就可以理解为是同步的。
举个例子,老刘买了个洗衣机,当他启动了洗衣机后如果一直在等待洗衣机工作结束好晾衣服,那他就是阻塞的;如果他启动洗衣机之后就去看电视了,估摸快洗完了就时不时来看看,那他就是非阻塞的,因为老刘可以去做另一件事。但老刘不能知道这洗衣机啥时候洗完/是否洗完,那么这台洗衣机就是同步方式工作的;老刘后来换了一台可以在洗完衣服播放音乐的洗衣机,这样就不用时不时来看了,虽然启动之后洗衣机不能立刻返回给老刘干净的衣服,但是可以在工作完成之后通知在看电视的老刘,所以新的洗衣机就是异步工作的。

在当前网络背景下,需要提高性能。方式有以下两种:

并行化:使用更多的线程和硬件资源;----->催生出了多线程编程
异步化:基于现有的资源来提高执行效率。  ------>催生出了响应式流

响应式需要解决得一个问题-流量控制

采用方式:回压

在响应式流中,数据流的发出者叫做Publisher,监听者叫做Subscriber。订阅者也需要有一种能够向上游反馈流量需求的机制。这种能够向上游反馈流量请求的机制就叫做回压

基本策略:

1.缓存策略:由于发布者的数据不能很快被订阅者处理掉,那么发布者会将未处理的数据元素缓存起来
2.丢弃策略:发布者不需要缓存来不及处理的数据,而是直接丢弃,当订阅者请求数据的时候,会拿到发布者那里最近的一个数据元素

从此,便出现了如下得响应式编程:

响应式流(异步非阻塞+背压机制)+ 变化传递 + 声明式范式

关于labmda与响应式编程的区别?

函数响应式编程的重点在于“函数式”的语言特性,这个概念在二十年前就盖棺定论了。  
响应式编程的重点在于“基于事件流”的异步编程范式,由不断产生的数据/时间来推动逻辑的执行。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。