Java Spring WebFlux与RxJava的比较

52

我开始学习Java响应式编程,整个响应式范式对我来说是新的。

在我的学习过程中,我遇到了一些术语/库,例如Spring WebFlux、projectreactor和RxJava。我希望有人能解释一下它们之间的区别,并告诉我你在项目中使用的是哪一个,为什么做出这种选择。

我看到Spring WebFlux实际上在内部使用projectreactor的Flux/Mono。这简化了问题:Spring Webflux相比RxJava的优缺点是什么?


8
我确实阅读了相关内容,但我很难做出决定,这也是我发表这个问题的原因。 - user1955934
3个回答

29

响应式编程是一种编程范式,但我不会称它为新事物。实际上,它已经存在了一段时间。就像面向对象编程、函数式编程或过程式编程一样,响应式编程也是另一种编程范式。

范式的定义由Reactive Manifesto决定。

反应式流则是一个规范。

对于Java程序员来说,反应式流是一个API。它是Kaazing、Netflix、Pivotal、Red Hat、Twitter、Typesafe等工程师之间合作的产物。反应式流很像JPA或JDBC。两者都是API规范。

反应式流API只包含4个高级接口。

  1. 发布者: 发布者是提供可能无限数量的序列化元素的程序,根据其订阅者的需求进行发布。
  2. 订阅者: 一旦将订阅者实例传递给发布者,通过订阅(Subscriber)方法,订阅者将在订阅者.onSubscribe(Subscription)上收到调用。
  3. 订阅: 订阅表示向发布者订阅一个订阅者的一对一生命周期。
  4. 处理器: 处理器代表一个处理阶段 - 它既是订阅者又是发布者,并遵守两者的契约。
这些概念在不同级别和领域中具有不同的表现形式。例如,Java开发人员可以思考如何在应用程序级别编程,数据库工程师可以思考数据库如何响应反应式API调用(例如,MongoDB已经实现了反应式流驱动程序),网络程序员可以思考如何在网络层面上使反应式调用更加有效。
一些基于JVM的遵循反应式流规范的框架包括:
  • Akka Streams 框架
  • Ratpack
  • Vert.x
  • ReactiveX (RxJava 2.x 和 Reactor)
  • Java 1.9 Flow 类(您会注意到,在Java 9中,反应式流接口移至 Flow 类下)

ReactiveX 是观察者模式、迭代器模式和函数式编程中最佳思想的结合。它扩展了观察者模式以支持数据和/或事件序列,并添加了运算符,允许您在声明性地组合序列的同时抽象出关于底层线程、同步、线程安全、并发数据结构和非阻塞 I/O 等方面的问题。

RxJava 2.0 和 Reactor 基于 ReactiveX 项目。Spring WebFlux 在内部使用 Reactor。


25

一般来说,RxJava适用于基于JDK8-的项目,而Project Reactor支持JDK8+。但对于初学者,可以先学习RxJava。因为Project Reactor可以考虑修复RxJava中的缺点,并更适合后端开发。RxJava存在太多问题,如果您无法好好使用它,可能会导致内存溢出。

但最终,如果您想很好地使用Spring 5.2+,您需要从RxJava->Reactor->NIO->Netty->Reactor netty学起。


16

Spring WebFlux(project-reactor)和RxJava2+都是reactive-streams的实现。

Spring使用project-reactor,因此得到更多支持、推广和更大的社区,所以我建议选择它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接