我一直在研究并尝试使用Reactor和RxJava进行编码的Reactive Style。我确实理解,与单线程执行相比,反应式编码可以更好地利用CPU。
在基于Web的应用程序中,反应式编程与命令式编程之间是否有任何具体的比较?
通过对非反应式编程使用反应式编程实现的性能增益和吞吐量是多少?
反应式编程的优点和缺点是什么?
有没有统计基准?
答案 0 :(得分:20)
好吧,反应式编程意味着您正在异步执行所有IO绑定任务,例如网络调用。例如,您的应用程序调用外部REST API或数据库,您可以异步执行该调用。如果这样做,您当前的线程不会阻止。您只需生成一个或几个线程就可以提供大量请求。如果您遵循阻塞方法,则需要有一个线程来处理每个请求。您可以参阅我的多部分博客帖子part one,part two和part three以获取更多详细信息。
除此之外,你可以使用回调来做同样的事情。您可以使用回调进行异步调用。但是,如果你这样做,有时你可能最终会回调地狱。在另一个内部进行一次回调会导致非常复杂的代码,这些代码很难维护。另一方面,RxJava允许您编写非常简单,可组合和可读的异步代码。此外,RxJava为您提供了许多强大的运算符,例如Map,Zip等,这使得您的代码更加简单,同时通过并行执行不依赖于彼此的不同任务来提高性能。
RxJava不是具有一组运算符的另一个Observer实现,而是为您提供了非常方便的错误处理和重试机制。
但是我没有使用命令式编程方法对RxJava进行任何基准测试,以便在统计上对您进行推荐。但我非常确定RxJava应该比阻塞机制产生更好的性能。
<强>更新强>
由于我随着时间的推移积累了更多的经验,我想为我的答案添加更多的观点。
基于article,ReactiveX是一个库,用于通过使用可观察序列来编写异步和基于事件的程序。我想你首先要阅读这篇介绍性文章。
这些是被动系统的一些属性:事件驱动,可扩展,弹性,响应
对于RxJava,它为程序员提供了两个主要功能。首先,它使用丰富的运算符(如zip,concat,map等)提供了一个很好的可组合API。这样可以生成更简单易读的代码。在代码方面,可读性和简单性是最重要的属性。其次,它提供了出色的抽象,使并发成为声明。
一个流行的误解是Rx默认是多线程的。说实话,Rx默认是单线程的。如果您想以异步方式执行操作,则必须通过传递相关调度程序,使用subscribeOn
和observeOn
运算符明确告知它。 RxJava为您提供线程池来执行异步任务。有许多调度程序,如IO,Computation等。顾名思义,IO调度程序最适合IO密集型任务,例如网络调用等。相反,计算调度程序适用于更多CPU密集型计算任务。您也可以使用RxJava连接自己的Executor服务。内置的调度程序主要帮助您摆脱维护自己的Executor服务,使您的代码更简单。
关于subscribeOn和observeOn
的最后一句话在Rx世界中,通常有两件事要控制并发模型:
SubscribeOn:指定Observable将在其上运行的调度程序。
ObserveOn:指定观察者将观察此Observable的调度程序
答案 1 :(得分:6)
缺点
缺乏良好而简单的学习资源。
经常混淆等同于功能反应式编程。
答案 2 :(得分:5)
除了他们已经回应的关于无阻塞功能的另一个很棒的功能,使用反应式编程,是背压的重要用途。通常用于您的发布者发布的信息多于您的消费者可以处理的信息。
因此,通过这种机制,您可以控制两者之间的流量,避免出现令人讨厌的内存问题。
您可以在此处查看一些反应性编程的实例示例https://github.com/politrons/reactive
关于这里的背压https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala
顺便说一下,反应性编程的唯一缺点是学习的曲线,因为你正在改变编程的范式。但是现在所有重要的公司都尊重并遵循反应性宣言http://www.reactivemanifesto.org/
答案 3 :(得分:2)
反应式编程是一种涉及智能路由和事件消费的微架构风格。
反应是你可以用更少的钱做更多的事情,特别是你可以用更少的线程处理更高的负载。
反应类型不是为了让您能够更快地处理您的请求或数据。它的优势在于它们能够同时提供更多请求,以及处理延迟操作,例如更有效地从远程服务器请求数据。
它们允许您通过本地处理时间和延迟来提供更好的服务质量和可预测的容量规划,而无需消耗更多资源。
从
https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fc
https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape
https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1
答案 4 :(得分:0)
优势
缺点
答案 5 :(得分:-1)
反应式编程是一种命令式编程。 反应式编程是一种并行编程。 仅当您设法创建并行分支时,才能通过单线程执行获得性能提升。它们是由多个线程执行还是由反应性构造(实际上是异步过程)执行都没有关系。
反应式编程相对于多线程编程的唯一优势是更低的内存消耗(每个线程需要0.5 ... 1兆字节)。缺点是不太容易编程。