Java 反应式编程的优点/缺点
我一直在研究和尝试使用Reactor和RxJava的反应式编码风格。我知道,与单线程执行相比,反应式编码可以更好地利用CPU 在基于web的应用程序中,反应式编程和命令式编程之间有什么具体的比较吗 通过使用反应式编程而不是非反应式编程,我获得了多少性能增益和吞吐量 反应式编程的优点和缺点是什么Java 反应式编程的优点/缺点,java,reactive-programming,microservices,rx-java2,project-reactor,Java,Reactive Programming,Microservices,Rx Java2,Project Reactor,我一直在研究和尝试使用Reactor和RxJava的反应式编码风格。我知道,与单线程执行相比,反应式编码可以更好地利用CPU 在基于web的应用程序中,反应式编程和命令式编程之间有什么具体的比较吗 通过使用反应式编程而不是非反应式编程,我获得了多少性能增益和吞吐量 反应式编程的优点和缺点是什么 是否有统计基准 那么,反应式编程意味着您正在异步执行所有IO绑定的任务,例如网络调用。例如,如果应用程序调用外部REST API或数据库,则可以异步执行该调用。如果这样做,则当前线程不会阻塞。只需生成一个
是否有统计基准 那么,反应式编程意味着您正在异步执行所有IO绑定的任务,例如网络调用。例如,如果应用程序调用外部REST API或数据库,则可以异步执行该调用。如果这样做,则当前线程不会阻塞。只需生成一个或几个线程,就可以为大量请求提供服务。如果您采用阻塞方法,则需要一个线程来处理每个请求。您可以参考我的多部分博客文章,并了解更多详细信息 除此之外,您可以使用回调来执行相同的操作。您可以使用回调进行异步调用。但是如果你这样做的话,有时你可能会陷入地狱。将一个回调放在另一个回调中会导致非常复杂的代码,这些代码很难维护。另一方面,RxJava允许您编写更简单、可组合和可读性更强的异步代码。此外,RxJava还为您提供了许多功能强大的操作符,如Map、Zip等,这使您的代码更加简单,同时由于不同任务的并行执行而提高了性能,而这些任务互不依赖 RxJava不是另一个具有一组运算符的观察器实现,而是它提供了非常方便的良好错误处理和重试机制 但我并没有用命令式编程方法对RxJava进行任何基准测试,以从统计学上赞扬您。但我非常确信RxJava应该比阻塞机制产生更好的性能 更新 随着时间的推移,我积累了更多的经验,因此我想在我的答案中添加更多的要点 基于,ReactiveX是一个库,用于使用可观察序列编写异步和基于事件的程序。我想你应该先看一下这篇介绍性文章 这些是反应式系统的一些特性:事件驱动、可伸缩、弹性和响应性 说到RxJava,它为程序员提供了两个主要工具。首先,它提供了一个很好的可组合API,使用了一组丰富的操作符,如zip、concat、map等。这会产生更简单、可读性更强的代码。说到代码,可读性和简单性是最重要的属性。其次,它提供了优秀的抽象,使并发成为声明性的 一个普遍的误解是Rx默认是多线程的。老实说,Rx默认为单线程。如果要异步执行操作,则必须通过传递相关的调度程序,使用
subscribeOn
和observeOn
操作符显式地告诉它。RxJava提供线程池来执行异步任务。有许多调度器,如IO、计算等。顾名思义,IO调度程序最适合于IO密集型任务,如网络调用等。相反,计算调度程序适用于CPU密集型计算任务。您还可以将自己的Executor服务与RxJava连接起来。内置调度器主要帮助您摆脱维护自己的Executor服务,使代码更加简单
最后是关于订阅和观察的一个词
在Rx世界中,通常有两件事需要控制并发模型:
ObserveOn:指定观察者将在其上观察此可观察的计划程序除了其他响应中提到的关于无阻塞功能的内容外,反应式编程的另一个重要功能是背压的重要使用。通常,它用于发布者发布的信息超出消费者处理能力的情况 因此,有了这种机制,您可以控制两者之间的流量,避免严重的内存不足问题 您可以在此处看到一些反应式编程的实际示例: 关于背压: 顺便说一下,反应式编程的唯一缺点是学习曲线,因为您正在改变编程范式。但如今,所有重要的公司都尊重并遵循这些原则。缺点
- 大多数时候存储数据流需要更多的内存(因为它是基于随时间变化的流)
- 刚开始学习时可能会觉得很不传统(需要一切都是顺流的)
- 大多数复杂性必须在宣布新服务时处理
- 缺乏好的简单的学习资源
- 经常被混淆为等同于函数式反应式编程
publisher
.map(()->mappingFunction)
.filter(()->filterFunction)
.flatmap(...)