反应式编程优点/缺点

prr*_*nay 21 java reactive-programming project-reactor microservices rx-java2

我一直在研究并尝试使用Reactor和RxJava进行编码的Reactive Style.我确实理解,与单线程执行相比,反应式编码可以更好地利用CPU.

在基于Web的应用程序中,反应式编程与命令式编程之间是否有任何具体比较?

通过对非反应式编程使用反应式编程,我实现了多少性能提升和吞吐量?

还原反应编程有哪些优缺点?

有没有统计基准?

Rav*_*ala 25

好吧,反应式编程意味着您正在异步执行所有IO绑定任务,例如网络调用.例如,您的应用程序调用外部REST API或数据库,您可以异步执行该调用.如果这样做,您当前的线程不会阻止.您只需生成一个或几个线程就可以提供大量请求.如果您遵循阻塞方法,则需要有一个线程来处理每个请求.您可以参考我的多部分博客文章第一部分,第二部分第三部分,以获取更多详细信息.

除此之外,你可以使用回调来做同样的事情.您可以使用回调进行异步调用.但是,如果你这样做,有时你可能最终会回调地狱.在另一个内部进行一次回调会导致非常复杂的代码,这些代码很难维护.另一方面,RxJava允许您编写非常简单,可组合和可读的异步代码.此外,RxJava为您提供了许多强大的运算符,例如Map,Zip等,这使得您的代码更加简单,同时由于并行执行不依赖于彼此的不同任务而提高了性能.

RxJava不是具有一组运算符的另一个Observer实现,而是为您提供了非常方便的错误处理和重试机制.

但是我没有使用命令式编程方法对RxJava进行任何基准测试,以便在统计上对您进行推荐.但我非常确定RxJava应该比阻塞机制产生更好的性能.

更新

由于我随着时间的推移积累了更多的经验,我想在我的答案中添加更多的观点.

基于该文章,ReactiveX是一个库,用于通过使用可观察序列来编写异步和基于事件的程序.我想你首先要阅读这篇介绍性文章.

这些是反应系统的一些属性:事件驱动,可扩展,弹性,响应

对于RxJava,它为程序员提供了两个主要功能.首先,它使用丰富的运算符(如zip,concat,map等)提供了一个很好的可组合API.这样可以生成更简单易读的代码.在代码方面,可读性和简单性是最重要的属性.其次,它提供了出色的抽象,使并发成为声明.

一个流行的误解是Rx默认是多线程的.说实话,Rx默认是单线程的.如果你想异步做事,那么你必须通过传递相关的调度程序来明确地使用subscribeOnobserveOn运算符.RxJava为您提供线程池来执行异步任务.有许多调度程序,如IO,Computation等.顾名思义,IO调度程序最适合IO密集型任务,例如网络调用等.相反,计算调度程序适用于更多CPU密集型计算任务.您也可以使用RxJava连接自己的Executor服务.内置的调度程序主要帮助您摆脱维护自己的Executor服务,使您的代码更简单.

最后在subscribeOn和observeOn上有一个词

在Rx世界中,通常有两件事要控制并发模型:

  1. 订阅的调用
  2. 观察通知

SubscribeOn:指定Observable将在其上运行的Scheduler.

ObserveOn:指定观察者将观察此Observable的Scheduler


Kri*_*wal 8

缺点

  • 大多数情况下,需要更多的内存来存储数据流(因为它是基于时间流的)。
  • 刚开始学习时可能会觉得不合常规(需要一切都顺畅)。
  • 宣布新服务时必须处理大多数复杂性。
  • 缺乏好的和简单的学习资源。

  • 通常被混淆为等同于功能反应式编程。

  • 你如何区分反应式编程和函数式反应式编程?您认为两者之间的哪些品质不同? (3认同)
  • 理解现有代码(即使是你自己编写的)要困难 X 倍。+ X 倍的时间花费在调试上(例如,没有堆栈跟踪,忘记通过分析现有应用程序如何工作来理解它们)。事务一致性,嗯...从业务角度来看,成本要高 X 倍,因为需要更多的开发/维护时间。我想知道是否有关于反应式编程的投资回报率的比较。我的意思是在昂贵的开发商身上投入更多的钱,同时在相对便宜的铁上节省一些钱:) (2认同)

pau*_*aul 5

Apart what they already response regarding no blocking features, another great feature to use Reactive programing, is the important use of backpressure. Normally is used in situations where your publisher emit more information than your consumer can process.

So having this mechanism you can control the flow of traffic between both and avoid the nasty out of memory problems.

You can see some practicle examples of Reactive programing here https://github.com/politrons/reactive

And about back pressure here https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala

顺便说一下,响应式编程的唯一缺点是学习曲线,因为您正在更改编程范式。但是如今,所有重要的公司都尊重并遵循反应式宣言http://www.reactivemanifesto.org/