文章字数:667,阅读全文大约需要2分钟
响应式编程
传统方式
前端访问后端,后端调用其他服务。
然而调用的过程中(即网络IO)需要等待结果,这种同步阻塞的过程会产生大量无用的等待。
占用服务端连接池(tomcat处理请求的线程)、降低吞吐量。1
前端--> tomcat ---> tomcate
响应式系统
- 有请求才会相应,快速响应
- 系统吞吐量增高
RxJava
- 一种响应式编程的类库
- 基于观察者模式 (订阅-发布)
生产者
三种类型的消费者
订阅关系
简写
1 | Observable.just("hello world")//简单创建一个生产者 |
变换操作符
1 | Observable.just("hello world")//简单创建一个生产者 |
中间操作使用不同线程
中间操作和消费者使用不同线程池
创建线程池操作
Schedulers.computation()
:和cup数量相关,cpu密集型使用Schedulers.io()
:io操作相关的操作Schedulers.newThread()
:直接创建线程,一般不用Schedulers.from()
:使用自定义线程池
出现多个subscribeon
以第一个为准,即被观察者的线程池只有一个。
应用于业务代码
Controller
层直接返回Observable,Spring
会自动订阅该生产者(RxJava的)- 可以节约连接池线程,连接池不用处理业务代码。
优点
- 减少代码量
- 简化线程操作,几乎不用考虑如何创建操作线程
Spring Reactor
DeferredResult
- 基于
Servlet3.0
的异步Servlet
(设置@Servlet(asyncSupported=true)
)
Controller
层直接返回DeferredResult
Servlet
进入两次,一次是请求进入,然后调用业务线程。自身直接返回(连接线程返回线程池)。业务线程执行完通过DeferredResult
再次找到Servlet
获取连接对象,返回信息