响应式编程
- 面向数据流和变化传播的编程范式
观察者模式、事件驱动、发布订阅等都可以被归类到响应式编程
要素
流
- 无数量上限的一串数据流或者按事件排序的时间事件流,流并非容器(迭代器),流是针对一系列元素操作的规范
- 不可变
- 异步
传播变化
流的变化 -> 数据/事件 -> 系统实时响应
声明式
规范
Java9 Flow
java.util.concurrent.Flow
- Publisher:消息生产者
- Subscriber:消息订阅者
- Subscription:管理生产者与订阅者
- Processor:既是生产者又是订阅者 是流水线节点的抽象
RxJava
Flowable.just("hello word").subscribe(System.out::println);
Publisher
Flowable
Observable
一个观察者(Observer)订阅一个可观察对象(Observable)
// 同步
Observable<Integer> observable1 = Observable.just(1, 2, 3);
// 异步
Observable<Object> observable2 = Observable.create(s -> {
if (new Random().nextBoolean()) {
s.onNext("kkk");
}else {
// 错误处理
s.onError(new RuntimeException("随机抛个异常"));
}
});
// operators
observable1
.map(v -> v + 1)
.filter(v -> true)
.subscribe(System.out::println);
observable2.subscribe(System.out::println, t -> System.out.println(t.getMessage()));
Single
它总是只发射一个值,或者一个错误通知,而不是发射一系列的值
Completable
Maybe
Subject
- 即是发布者 又是订阅者
AsyncSubject
BehaviorSubject
PublishSubject
ReplaySubject
Subscriber
- Observer
- SingleObserver
- CompletableObserver
- MaybeObserver
Operators
- 类似于java8 stream 的中间操作
Scheduler
可以指定操作符(或者特定的Observable)在特定的调度器(Scheduler)上执行
https://mcxiaoke.gitbooks.io/rxdocs/content/Scheduler.html
Backpressure
- ERROR
- BUFFER
- DROP
- LATEST 类似于BUFFER 但是不是丢最新的
Reactor
组装
不会触发任何实际的调用,用来描述计算组织过程。只有在管道被订阅时,数据流才会开始流动
Flux
Mono
与Flux的区别在于Mono只能包含0个或1个元素
与 SpringWebFlux
Akka
ActorRef
- Actor的地址
ActorPaths
- 用于定位Actor
Dispatchers
- 用于调度Actor在哪个线程上执行
Akka Streams
- 基于Akka Actor 但无需管理
原始数据 -> Source -> Flow... -> Sink(最终消费者)
Materialization(物化)
物化过后流才会被执行