Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反应式编程的优点/缺点_Java_Reactive Programming_Microservices_Rx Java2_Project Reactor - Fatal编程技术网

Java 反应式编程的优点/缺点

Java 反应式编程的优点/缺点,java,reactive-programming,microservices,rx-java2,project-reactor,Java,Reactive Programming,Microservices,Rx Java2,Project Reactor,我一直在研究和尝试使用Reactor和RxJava的反应式编码风格。我知道,与单线程执行相比,反应式编码可以更好地利用CPU 在基于web的应用程序中,反应式编程和命令式编程之间有什么具体的比较吗 通过使用反应式编程而不是非反应式编程,我获得了多少性能增益和吞吐量 反应式编程的优点和缺点是什么 是否有统计基准 那么,反应式编程意味着您正在异步执行所有IO绑定的任务,例如网络调用。例如,如果应用程序调用外部REST API或数据库,则可以异步执行该调用。如果这样做,则当前线程不会阻塞。只需生成一个

我一直在研究和尝试使用Reactor和RxJava的反应式编码风格。我知道,与单线程执行相比,反应式编码可以更好地利用CPU

在基于web的应用程序中,反应式编程和命令式编程之间有什么具体的比较吗

通过使用反应式编程而不是非反应式编程,我获得了多少性能增益和吞吐量

反应式编程的优点和缺点是什么


是否有统计基准

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

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

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

但我并没有用命令式编程方法对RxJava进行任何基准测试,以从统计学上赞扬您。但我非常确信RxJava应该比阻塞机制产生更好的性能

更新

随着时间的推移,我积累了更多的经验,因此我想在我的答案中添加更多的要点

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

这些是反应式系统的一些特性:事件驱动、可伸缩、弹性和响应性

说到RxJava,它为程序员提供了两个主要工具。首先,它提供了一个很好的可组合API,使用了一组丰富的操作符,如zip、concat、map等。这会产生更简单、可读性更强的代码。说到代码,可读性和简单性是最重要的属性。其次,它提供了优秀的抽象,使并发成为声明性的

一个普遍的误解是Rx默认是多线程的。老实说,Rx默认为单线程。如果要异步执行操作,则必须通过传递相关的调度程序,使用
subscribeOn
observeOn
操作符显式地告诉它。RxJava提供线程池来执行异步任务。有许多调度器,如IO、计算等。顾名思义,IO调度程序最适合于IO密集型任务,如网络调用等。相反,计算调度程序适用于CPU密集型计算任务。您还可以将自己的Executor服务与RxJava连接起来。内置调度器主要帮助您摆脱维护自己的Executor服务,使代码更加简单

最后是关于订阅和观察的一个词

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

  • 订阅的调用
  • 通知的遵守
  • SubscribeOn:指定可观察对象将在其上运行的计划程序


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

    除了其他响应中提到的关于无阻塞功能的内容外,反应式编程的另一个重要功能是背压的重要使用。通常,它用于发布者发布的信息超出消费者处理能力的情况

    因此,有了这种机制,您可以控制两者之间的流量,避免严重的内存不足问题

    您可以在此处看到一些反应式编程的实际示例:

    关于背压:

    顺便说一下,反应式编程的唯一缺点是学习曲线,因为您正在改变编程范式。但如今,所有重要的公司都尊重并遵循这些原则。

    缺点

    • 大多数时候存储数据流需要更多的内存(因为它是基于随时间变化的流)
    • 刚开始学习时可能会觉得很不传统(需要一切都是顺流的)
    • 大多数复杂性必须在宣布新服务时处理
    • 缺乏好的简单的学习资源

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


    反应式编程是一种微体系结构,涉及智能路由和事件消耗

    被动是指您可以用更少的线程做更多的事情,特别是您可以用更少的线程处理更高的负载

    反应式类型不允许您更快地处理请求或数据。它们的优势在于能够同时处理更多请求,并能更高效地处理延迟操作,例如从远程服务器请求数据

    它们允许您提供更好的服务质量和可预测的容量规划,方法是以本机方式处理时间和延迟,而无需
     publisher
         .map(()->mappingFunction)
         .filter(()->filterFunction)
         .flatmap(...)