我一直在研究和尝试使用Reactor和RxJava编写响应式编码。我确实知道,与单线程执行相比,反应式编码可以更好地利用CPU。
在基于Web的应用程序中,反应式编程与命令式编程之间是否有具体的比较?
通过使用反应式编程而不是非反应式编程,我可以获得多少性能提升和吞吐量?
响应式编程还有哪些优缺点?
有统计基准吗?
最佳答案
好的,响应式编程意味着您正在异步执行所有IO绑定任务,例如网络调用。例如,您的应用程序调用了外部REST API或数据库,则可以异步执行该调用。如果这样做,当前线程不会阻塞。您可以仅生成一个或几个线程即可满足许多请求。如果采用阻塞方法,则需要一个线程来处理每个请求。您可以参阅我的多篇博客文章part one,part two和part three以获得更多详细信息。
除此之外,您可以使用回调执行相同的操作。您可以使用回调进行异步调用。但是,如果这样做,有时可能会导致回调地狱。在另一个回调中包含一个回调会导致非常复杂的代码,很难维护。另一方面,RxJava使您可以编写更简单,可组合和可读的异步代码。此外,RxJava还为您提供了许多强大的运算符,例如Map,Zip等,这使您的代码更加简单,同时由于相互独立执行的不同任务的执行而提高了性能。
RxJava并不是另一个带有一组运算符的Observer实现,而是它为您提供了非常方便的良好错误处理和重试机制。
但是我没有用命令式编程方法对RxJava进行任何基准测试,以从统计角度上赞扬您。但是我非常确定RxJava应该比阻塞机制产生更好的性能。
更新资料
由于随着时间的推移我积累了更多的经验,因此我想在答案中增加更多的要点。
ReactiveX是基于article的库,用于通过使用可观察的序列来组成异步和基于事件的程序。我认为您首先要阅读这篇介绍性文章。
这些是反应性系统的一些属性:事件驱动,可伸缩,弹性,响应式
对于RxJava,它为程序员提供了两个主要功能。首先,它使用一组丰富的运算符(例如zip,concat,map等)提供了一个不错的可组合API。这产生了更简单易读的代码。在代码方面,可读性和简单性是最重要的属性。其次,它提供了出色的抽象,使并发成为声明性的。
一个普遍的误解是默认情况下Rx是多线程的。老实说,默认情况下,Rx是单线程的。如果要异步执行操作,则必须通过传递相关的调度程序,使用subscribeOn
和observeOn
运算符明确地告诉它。 RxJava为您提供线程池以执行异步任务。有许多调度程序,例如IO,计算等等。顾名思义,IO调度程序最适合诸如网络调用等IO密集型任务。相反,计算调度器对CPU密集型计算任务非常有用。您也可以使用RxJava连接自己的Executor服务。内置的调度程序主要帮助您摆脱维护自己的Executor服务的麻烦,使代码更简单。
最后一个关于subscribeOn和observeOn的词
在Rx世界中,通常需要控制两件事:
订阅的调用
通知的观察
SubscribeOn:指定将在其上运行Observable的调度程序。
ObserveOn:指定调度程序,观察者将在该调度程序上观察此Observable