我一直在研究和尝试使用Reactor和RxJava的响应式编码方式。我确实理解,与单线程执行相比,反应式编码可以更好地利用CPU。
在基于web的应用程序中,反应式编程和命令式编程之间有什么具体的比较吗?
通过使用反应式编程比使用非反应式编程,我获得了多大的性能增益和吞吐量?
另外,反应式编程的优点和缺点是什么?
有没有统计基准?
发布于 2017-02-06 15:45:33
那么,响应式编程意味着您正在执行所有IO绑定任务,例如异步网络调用。对于一个实例,假设您的应用程序调用外部REST API或数据库,您可以异步执行该调用。如果你这样做,你的当前线程不会阻塞。你可以通过仅仅产生一个或几个线程来服务于大量的请求。如果你采用阻塞方法,你需要有一个线程来处理每个请求。你可以参考我的博客文章part one,part two和part three了解更多细节。
除此之外,你可以使用回调来做同样的事情。您可以使用回调进行异步调用。但如果你这样做,有时你可能会以回调地狱而告终。将一个回调函数放在另一个回调函数中会导致非常复杂的代码,这些代码很难维护。另一方面,RxJava使您可以编写更简单、可组合和可读性更强的异步代码。此外,RxJava还提供了许多强大的运算符,如地图,压缩等,这使得你的代码变得更加简单,同时由于不同任务的并行执行而提高了性能,这些任务彼此不依赖。
RxJava不是另一个带有一组操作符的观察者实现,相反,它为您提供了很好的错误处理和重试机制,这非常方便。
但我没有用命令式编程方法对RxJava进行任何基准测试,以从统计上推荐您。但是我非常确定RxJava应该比阻塞机制产生更好的性能。
更新
随着时间的推移,我积累了更多的经验,我想在我的答案中添加更多的点。
ReactiveX是一个基于article的库,用于使用可观察到的序列组成异步和基于事件的程序。我认为你应该先看一遍这篇介绍性的文章。
以下是反应式系统的一些属性:事件驱动、可伸缩、弹性、响应式
当涉及到RxJava时,它为程序员提供了两个主要工具。首先,它提供了一个很好的可组合的API,它使用了一组丰富的运算符,如zip、concat、map等。这会产生更简单、更易读的代码。当涉及到代码时,可读性和简单性是最重要的属性。其次,它提供了优秀的抽象,使并发性成为声明性的。
一个普遍的误解是Rx默认情况下是多线程的。事实上,Rx默认情况下是单线程的。如果你想异步做事情,那么你必须通过传递相关的调度器,使用subscribeOn
和observeOn
操作符显式地告诉它。RxJava为您提供了执行异步任务的线程池。有许多调度器,如IO、计算等。IO调度器,顾名思义,最适合IO密集型任务,如网络调用等。相反,计算调度器更适合CPU密集型计算任务。您也可以将自己的Executor服务与RxJava连接起来。内置的调度器主要帮助您摆脱维护自己的Executor服务,使您的代码更简单。
最后一句话是关于subscribeOn和observeOn的
在Rx世界中,通常有两件事需要控制并发模型:
调用notifications的subscription
SubscribeOn:指定可观察对象将在其上运行的调度程序。
ObserveOn:指定观察者将在其上观察此可观察对象的调度程序
发布于 2017-08-29 20:00:12
缺点
发布于 2017-02-06 16:47:52
除了已经在其他关于无阻塞特性的回复中提到的之外,反应式编程的另一个伟大特性是重要的背压的使用。通常情况下,它用于发布者发出的信息多于使用者可以处理的信息的情况。
因此,有了这种机制,您可以控制两者之间的流量,并避免严重的内存不足问题。
你可以在这里看到一些反应式编程的实际例子:https://github.com/politrons/reactive
关于背压:https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala
顺便说一句,反应式编程的唯一缺点是学习曲线,因为您正在改变编程范例。但如今,所有重要的公司都尊重并遵循reactive manifesto。
https://stackoverflow.com/questions/42062199
复制相似问题