反应式编程优点/缺点

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

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

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

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

有没有统计基准?

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

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

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

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

更新

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

基于这篇文章 ,ReactiveX是一个使用可观察序列组成异步和基于事件的程序的库。 我想你首先要阅读这篇介绍性文章。

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

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

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

最后在subscribeOn和observeOn上有一个词

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

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

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

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

除了他们已经回应的关于无阻塞function之外,使用反应式编程的另一个重要function是背压的重要用途。 通常用于您的发布者发布的信息多于您的消费者可以处理的信息。

因此,通过这种机制,您可以控制两者之间的流量,避免令人讨厌的内存问题。

您可以在https://github.com/politrons/reactive看到一些react native编程的实例

关于这里的背压https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala

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

缺点

  • 大多数时候存储更多内存以存储数据流(因为它基于随时间变化的流)。
  • 在开始学习可能会感到非常规(需要一切都是一个流)。
  • 在宣布新服务时必须处理大多数复杂问题。
  • 缺乏良好而简单的学习资源。

  • 经常混淆等同于function反应式编程。

反应式编程是一种涉及智能路由和事件消耗的微架构风格。

Reactive是指您可以用更少的资源做更多事情,特别是您可以用更少的线程处理更高的负载。

反应类型不是为了让您能够更快地处理您的请求或数据。它的优势在于它们能够同时提供更多请求,以及处理延迟操作,例如更有效地从远程服务器请求数据。

它们允许您通过本地处理时间和延迟来提供更好的服务质量和可预测的容量规划,而无需消耗更多资源。


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