反应式编程的优点/缺点

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

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

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

此外,反应式编程的优缺点是什么?

是否有任何统计基准?


答案 1

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

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

RxJava不是另一个具有一组运算符的观察者实现,而是为您提供良好的错误处理和重试机制,这些机制非常方便。

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

更新

由于我随着时间的推移积累了更多的经验,我想在我的答案中增加更多的分数。

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

以下是反应式系统的一些属性:事件驱动、可扩展、弹性、响应

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

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

最后,关于订阅On和 observeOn的一句话

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

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

SubscribeOn:指定可观察对象将在其上运行的计划程序。

ObserveOn:指定观察者将在其上观察此 Observable 的计划程序


答案 2

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

  • 经常被混淆为等同于函数式反应式编程。


推荐