1、什么是Reactive?
Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.
引用来自:Reactive-Streams Specification
2、Reactive的优缺点
优点:
- 响应式编程
- 解决Callback嵌套问题,让异步编程更简单(jdk的CompletableFuture也能简单解决,但是提供的操作符相对少)
- 流式编程,纵享丝滑
- 线程切换极致简单
缺点:
- 线程Stack Trace不友好,线程栈链路更长
- 有一定的编码难度,需要从同步编程转向异步编程
- 增加内存开销,每一个操作符都需创建对象
3、实现Reactive-Streams规范的常用框架
4、Reactive API Components
- Publisher:数据的发布者
a. subscribe( Subscriber s):数据订阅方,每个发布者都需要一个订阅者 - Subscriber:数据的订阅者,可以理解成类似Sink,有几种事件方法。
a. onSubscribe( Subscription s ):当发生订阅时,在调用Publisher#subscribe方法后执行
b. onNext( T t ):当调用Subscription#request(long)后,Publisher成功响应数据会执行onNext
c. onError( Throwable t ):流执行过程中报错触发
d. onComplete():流执行完成事件 - Subscription:管理控制流
a. request(long n):请求上游Publisher发布数据数量,Long.MAX_VALUE表示请求unbounded
b. cancel():取消流。不能在onComplete和onError事件之后取消。 - Processor:继承了Publisher和Subscriber,即是发布者也是订阅者。
5、一张简单的图
本质上Subscriber主动request数据,Publisher则push(onNext)给Subscriber
6、一张复杂的图
- Subscriber向Publisher订阅( subscribe() ) (下游 → 上游)
- Publisher通知Subscriber订阅事件( onSubscribe() ) (上游 → 下游)
- Subscriber向Publisher请求数据( request( n ) ) (下游 → 上游)
- Publisher向Subscriber发送数据( onNext( t ) )(上游 → 下游)
- Publisher向Subscriber发送完成事件 ( onComplete() )(上游 → 下游)
7、更好的方案
- 协程:用户态轻量级协程。不在这里展开讨论协程。
8、Conclusion
其实从前面了解到,reactive的优点并不是那么突出,反而会带来开发的难度。但软件开发是一个trade offs 的过程。Java领域中,reactive首先流行在Android中,主要框架是RxJava。在Android中,常常将耗时的操作切换到别的Schedulers,不阻塞Android主线程(Android UI渲染需要在主线程),同时将结果通知到主线程,这样主线程只需要渲染处理后的结果,不会造成Android的卡顿,给用户带来更好的体验。由于RxJava的操作符支持丰富,线程切换非常方便,所以Android成了新宠(当然不仅仅这一个原因)。基于这个例子,可以联想到Netty的EventLoop也是不允许阻塞的,需要fork子线程来处理,所以就有了RxJava + Netty=Zuul 2.0。