1 reactor 出现的背景、初衷和要达到什么样的目标
Reactor 项目始于 2012 年。 经过长时间的内部孵化,于 2013 年发布 Reactor 1.x 版本。 Reactor 1 在各种架构下都能成功部署,包括开源的(如 Meltdown)和商业的(如 Pivotal RTI)。2014年,通过与一些新兴的响应式数据流规范合作,重新设计并于 2015 年 4 月发布 Reactor 2.0 版本。
1.1 阻塞浪费资源
互联网企业基本上都有着大量的用户,即使当代硬件的性能已经提升了很多,但是性能问题一直是互联网企业不能忽略的一个问题。通常有两种方式来提升应用的性能:
- 使用更多的线程和硬件资源达到并行化。这也是很多企业采用的方式;
- 在当前使用的资源上寻求更高效的处理。这在全球经济下行的背景下,是一种成本更低的方式;
1.2 异步能拯救一切嘛?
通过编写异步非阻塞的代码,可以将执行切换到使用了相同底层资源的另一活动任务上,然后在异步完成之后返回到当前任务。提升资源利用率。
java 提供了两种编写异步(异步不一定非阻塞)代码的方式。
- Callbacks:不立即返回对象,但是提供了一个 callback 参数,当结果可返回时调用。
- Future:这也是现在大部分程序员在使用的方式。异步方法会立即返回一个 Future。Future 对象对获取该值进行了包装,这个对象可以一直轮询知道返回(除非设置了超时时间)。例如,ExecutorService 使用 Future 对象执行 Callable任务。
这些技术都有自己的问题:
callback 不好组合,编写有难度,且很容易导致代码难以阅读和维护。 Future 比callback好很多,但是也有自己的问题。
- 调用 get() 方法会阻塞;
- 缺乏对多值和高级错误处理的支持。
1.3 从命令式到响应式
作为响应式编程方向上的第一步,Microsoft在.NET生态中创建了响应式(Rx)扩展库。然后RxJava实现了JVM上的响应式编程。随着时间的推移,通过Reactive Streams的努力,一套基于JVM为响应式库定义接口与交互规则的标准规范
Reactive Streams
出现了。其接口已经集成到了Java9中的 Flow 类下。
响应式旨在解决上述 JVM 提供的异步方式的缺点,同时关注了其他一些方面:
- 组合型和易读性
- 数据作为 流 操作,有着丰富的操作符
- 在订阅之前什么都不会发生(有什么优点?)
- 背压,消费者可以向生产者发送信号表示发布速率太快
- 与并发无关的高阶抽象
reactor 是响应式编程的一种实现。
现代应用程序需要处理大量并发请求并处理大量数据。标准的阻塞代码不再足以满足这些要求。
反应式设计模式是一种基于事件的架构方法,用于异步处理来自单个或多个服务处理程序的大量并发服务请求。
Project Reactor 基于这种模式,并有一个明确而雄心勃勃的目标,即在 JVM 上构建非阻塞、反应式应用程序。
2 reactor 优势和劣势分别是什么
- 优势
- 异步
- 非阻塞
- 代码可读性高
- 背压 解决消息的消费可能比生产慢。
- 劣势
- 对于非响应式 java 开发者来说,学习曲线陡峭。
- debug 难度高
3 reactor 的适用场景
- 创建事件驱动程序;
- 亚马逊等大型在线购物平台的通知服务
- 为银行业提供庞大的交易处理服务
- 股票价格同时变动的股票交易业务
4 reactor 组成部分和关键节点
4.1 Mono
一种生成数据流的方式。包含0-1个结果的异步序列。
代码语言:javascript复制Mono.just(1);
4.2 Flux
另一种生成数据流的方式。包含0-N个结果的异步序列。
代码语言:javascript复制Flux.just(1, 2, 3, 4)
5 底层原理与关键实现
生产者-消费者模式?迭代模式?
6 其他竞品技术
https://lxdd.gitbook.io/spring-webflux/reactor
- Spring Webflux
- Project Reactor
Spring WebFlux (project-reactor) 和 RxJava2 都是响应式流的实现。 Spring 正在使用 project-reactor,因此它得到了更多的支持、广告和更大的社区,所以用它的人比较多。
6.1 Spring Webflux
Spring Webflux 是一个使用响应式库创建 web 服务的框架。它的主要目标是确保低资源使用(即线程数量少)的高可伸缩性。在底层,它使用 Project Reactor,但是,你也可以将它与 RxJava (或任何其他的响应流实现)一起使用,它甚至可以与 Kotlin 协程一起工作。
换句话说, Reactor 是一个基础响应式包,Spring WebFlux 是一个框架,这个框架默认使用 Reactor,但是可以使用 RxJava,也可以使用 Kotlin 等其他响应式包。
Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。反应式堆栈 Web 框架 Spring WebFlux 是在 5.0 版中添加的。它是完全非阻塞的,支持 Reactive Streams 背压,并且可以在 Netty、Undertow 和 Servlet 3.1 容器等服务器上运行。
Hello World 级示例:https://blog.csdn.net/get_set/article/details/79480233
6.2 Project Reactor
Project Reactor 是一个通用的反应库。与 RxJava 类似,它基于响应式流规范。它与 Java 8 Stream 和 Optional 类似,不同之处在于它支持异步编程、内置错误处理、支持背压并具有大量运算符(map、filter 等等)。
6.3 RxJava2
ReactiveX 结合了观察者模式、迭代器模式和函数式编程的最佳思想。它扩展了观察器模式,以支持数据序列和/或事件,并添加了操作符,允许您以声明的方式将序列组合在一起,同时抽象出诸如低级线程、同步、线程安全、并发数据结构和非阻塞I/O等问题。
一般来说,RxJava 支持基于 JDK8- 的项目,project Reactor 支持 JDK8 。但是对于初学者来说,你可以先学习 RxJava。Project Reactor 可以弥补 RxJava 的缺点,更适合后端开发。RxJava 有太多的问题,如果你不能很好地使用它,可能会导致内存溢出。但最后,如果你想很好地使用 Spring 5.2 ,你需要学习 RxJava->Reactor->NIO->Netty->Reactor Netty。
6.4 Reactor VS RxJava
RxJava 和 Reactor 是一些非常著名的库,用于与任何应用程序的后端相关的一些开发。Rxjava 支持的项目大多与 JDK8 相关,而 Reactor 则与所有与 JDK8 相关的项目相关。RxJava产生了许多可能导致内存相关问题的问题,但是当与 spring 5.2 一起使用时,它会变得非常好。reactor 通常被称为反应式编程范式,它主要涉及用于操作的反应式流 API,并使整个 API 流活动。
https://www.educba.com/rxjava-vs-reactor/
1、github地址:https://github.com/reactor/reactor-core
2、官方文档:https://easywheelsoft.github.io/reactor-core-zh/index.html#error.handling
3、https://segmentfault.com/a/1190000017548728
4、https://www.infoq.com/articles/reactor-by-example/
5、Spring Webflux : https://www.baeldung.com/spring-webflux
6、Java Spring WebFlux vs RxJava:https://stackoverflow.com/questions/56461260/java-spring-webflux-vs-rxjava