一、异步编程
Event Channel的出现减轻了Subcriber的压力
二、概述
2.1)Reactor官方弹出图
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)接口文档
Subscriber需要解决的问题是不知道有多少个Event调用onNext(),多了压力就可能使系统奔溃——所以需要做背压处理
4.2)API
sink.complete()可以结束generate()
http调用,在WebFlux中常将Mono转来转去
把两个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
九、线程相关
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
十、Flux vs Stream
Stream只是函数式编程的工具,Reactor在函数式编程的基础上引入了Event的概念
从上到下都需要是响应式中间一层响应式意义不大,初学者和容易将响应式编程写成同步代码占用主loop