响应式编程(一)

一、异步编程

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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容