响应式编程
我们熟悉了使用命令式产生副作用的编程方式,自然遇到问题时也都会使用这种思考方式来进行思考,当面对越来越复杂的应用场景,如何提升开发效率,降低维护成本一直是编程永恒追求的话题,是不是还有更好的编程模式,响应式编程能不能更优雅的解决一些问题
什么是响应式编程呢?响应式编程(Reactive Programming )本质就是使用异步数据流进行编程。目前主流语言都支持了RP,通过库和函数的方式提供一套处理异步数据流的接口规范。
这里面包含的两个核心概念。异步,不需要等待处理完成便立刻返回,通过回调将处理结果带回。能提高吞吐量,提高性能和效率。数据流stream,就是按照时间线的事件序列,任何东西都可以看做是一个stream。在这个基础上通过函数来组合、过滤、变换这些stream。通过定义事件处理器,来异步捕获感兴趣的stream,即监听(订阅)stream,也叫就是注册观察者。
响应式编程提高编程表达的抽象层次,通过抽象出stream,定义业务逻辑依赖关系的事件,当stream流动起来的时候,事件的观察者异步的做出响应。
如果你了解过异步编程,你会发现响应式编程与异步编程的模式有点类似,异步编程通常的解决方案是返回一个Promise,然后监听Promise被resolved或rejected带回结果进而做相应的处理。Rx Stream较Promise更进一步,异步返回多个值。这里的关键是以响应式编程的方式来思考解决问题。
响应式编程适用于那些场景呢?RP本质上是一个适合开发任何事件驱动的编程模式,强交互、多人协作、并发等都可以抽象为事件来驱动,事件的场景也会越来越多。
RxJava是ReactiveX在JVM上的一个实现,是一种用Java实现的响应式编程,来创建基于事件的异步程序。RxKotlin是Kotin语言到RxJava的绑定,让你更愉快的使用Rx来编程。RxJava最重要的三个概念: Observable(被观察者)、Subscriber(观察者)、Subscribe(订阅)。他们之间的关系用代码表达即
Obervable.create().subscribe(new Subscriber())
创建一个被观察对象,订阅一个观察者。RxJava为不同的场景提供了创建方式:from
,just
等,实际情况你需要进行一些变换才能得到你想要的被观察对象,Rx提供了多种转换的方式: map
,merge
,flatMap
。由于stream天生就是异步的,将一些耗时的处理委派给线程池来处理,完成后再切换回到stream,通过这种方式来利用其它的技术优势。这是一种编程框架,不仅提供了一种新的抽象层次,同时也能很自然的整合其它技术投资。
看起来如此完美的解决方案,那就让所有数据都流起来吧,可实际情况常常会出现很多不协调的地方,比如上游的流动过快而下游处理不过来,这时候就需要Flow Control技术来协调了。Flow Control大概有下面的思路:
- backpressure 背压
- throttling 节流
- packing 打包处理
- Callstack blocking 调用链阻塞
背压,也称为Reactive Pull,下游根据自己接收窗口的情况来控制接收速率,并通过反向的request请求控制上游的发送速率。RxJava通过Flowable创建的对象可以指定flow control策略,如
- onBackpressureBuffer
- onBackpressureDrop
- onBackpressureLatest
除了这些,RxJava还提供了更多,通过抽象Scheduler的概念来支持调用链线程的切换subscribeOn/observeOn
- Schedulers.immediate() 默认的方式,直接在当前线程运行,相当于不指定线程
- Schedulers.newThread() 总是开启新的线程进行操作
- Schedulers.io() 一个无数量上限的线程池
- Schedulers.computation() 固定数量( CPU 核数)的线程池
最后,talk is cheap, show me the code
-以上-
链接: