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