一、异步编程



Event Channel的出现减轻了Subcriber的压力







二、概述

类似JAVA有万物皆对象

2.1)Reactor官方弹出图


传统onClick()方法中判断双击不好写
2.2)发展历史

2.3)Reactive Stream 规范

主要有右侧四个接口角色,相较于传统的异步编程,Subscriber多了request(n)进行背压处理,还可以cancel()取消订阅;而且通过onError | onComplete增加了生命周期处理(传统的异步编程没法知道谁在运行代码处理异常不知道抛给谁,也不知道事件完成后是否需要释放资源)
2.4)Project Reactor 特性(Java的实现)

先出规范后有实现,比如先有Java规范后有虚拟机实现
三、Subscriber

Nothing happened until Subscriber() 的意思是在订阅之前比如上文双击时间,只有订阅后上述转换函数才会真正执行
四、创建Flux & Mono
4.1)接口文档

Flux

Mono(只有一个事件,完全可以转成Flux)

Subscriber需要解决的问题是不知道有多少个Event调用onNext(),多了压力就可能使系统奔溃——所以需要做背压处理
4.2)API

创建流




generate()可以一直执行下去

sink.complete()可以结束generate()

http调用,在WebFlux中常将Mono转来转去

可定时产生Event

把两个Event Stream合并成一个新的Event Stream

像拉链一样一对一匹配(自定义一对一匹配规则)


转换函数
五、命令式编程风格到函数编程风格的转换



左边同步,右边异步——异步好处把处理循序交给框架托管,第一步没完成第二步不会等待
六、重温flatMap

异步里边有异步——地狱回调

尽可能快订阅指假如圆圈中的方形Event有IO或者RPC之类,为了解决nothing happened until subscribe()就会先将所有圆圈订阅完——concatMap最严格,其次是flatMapSequential(常用)

正常一一映射只能得到两个圆圈,但是flatMap()将圆圈里边的东西扁平化处理成方形的映射



七、背压(backpressure)

响应式编程使得不同语言进行通讯的过程中可以商讨背压策略

继承BaseSubscriber<T>用来自己实现较复杂的Subscriber——subscription.request(n)为主动背压策略

onBackpressureBuffer()为防御策略
八、Hot publisher vs Cold publisher

大部分应用场景都用Cold publisher

不常见
九、线程相关


提高吞吐量
9.1)publishOn

从publishOn开始设置一个队列处理最后两步,由于在不同线程中处理,所以一个Event从上到下执行所有步骤的时刻不一定匹配,所以要一个Queue,publishOn从Flux里拉到Queue中的时候角色是Subscriber,publishOn从Queue中推给Thread A的时候角色是Publisher

publishOn改变了后续op3,op4等步骤运行在黄色线程,subscribe控制从头开始运行的op1,op2等步骤还是在蓝色线程运行

9.2)subscribeOn

subscribeOn改变了subscribe本来在蓝色线程中运行,这样从头开始所有步骤都会运行在黄色线程中

9.3)publishOn mixsubscribeOn

虽然有subscribeOn改变了subscribe运行的线程,但是后续的publishOn截断将op4改为了绿色线程中运行

9.4)subscribe() on another Thread

在非主线程中执行subscribe
十、Flux vs Stream

Stream只是函数式编程的工具,Reactor在函数式编程的基础上引入了Event的概念

从上到下都需要是响应式中间一层响应式意义不大,初学者和容易将响应式编程写成同步代码占用主loop