当前位置: 首页 > 知识库问答 >
问题:

反应式编程比非反应式编程消耗更多的资源吗?

田博易
2023-03-14
    null

在这两种实现中,REST控制器都直接从存储库中获取数据,并将其作为列表RESP返回。作为通量。不执行进一步的应用程序逻辑。

我们对100个调用服务的用户进行了一个小型负载/性能测试,我们发现非反应实现的性能远远好于反应实现。

事实上,非反应实现不仅有更好的HTTP吞吐量,而且更有趣的是,它比反应实现消耗更少的CPU和线程!这与预期尤其相反,因为我们预期反应版本只需少量线程即可扩展,如https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-M1中所述

有人面临过类似的问题吗?

共有1个答案

卫逸春
2023-03-14

我们使用spring-data-active-cassandra和Spring-Webflux对Spring-Data-Cassandra和spring-mvc执行了类似的测试。

我们对这两个服务器进行了10000个请求的基准测试,并发量为100个请求/秒。结果并不令人惊讶:-

Non Reactive Stack:-
         Concurrency Level:      100
         Time taken for tests:   22.945 seconds
         Complete requests:      10000
         Failed requests:        0
         Percentage of the requests served within a certain time (ms)
           50%    190
           66%    253
           75%    288
           80%    314
           90%    384
           95%    465
           98%    627
           99%    824
          100%   1208 (longest request)

Reactive Stack:-
         Concurrency Level:      100
         Time taken for tests:   30.061 seconds
         Complete requests:      10000
         Failed requests:        0
         Percentage of the requests served within a certain time (ms)
           50%    304
           66%    379
           75%    421
           80%    443
           90%    507
           95%    589
           98%    694
           99%    736
          100%    858 (longest request)

在执行这些测试时,非Reactor栈产生了147个线程,而Reactor栈产生了48个线程。

如果您比较结果,非Reactor栈比Reactor栈稍微快一点。它在大约23秒内将10,000个对象持久化到数据库中,而Reactor栈大约需要30秒。但是,如果比较两个堆栈中最慢的2%请求,Reactor栈几乎快了28%。

反应式堆栈的线程数较少,响应时间分布较均匀。没有一个请求被搁置。而对于无Reactor栈,1%的要求相对来说慢得可怕。

在一段持续的时间内,随着调用次数的增加,与非Reactor栈相比,Reactor栈将能够更好地扩展。因为与在服务器上打开的套接字数量相比,可以在服务器上生成的线程数量要少得多。同样,在这些测试中,CPU利用率在两个场景中都低于33%,从而证明CPU利用率并没有限制可伸缩性。

 类似资料:
  • 我开始更多地接受反应式编程,并试图将其应用于我的典型业务问题。我经常使用的一种模式是数据库驱动类。我有一些已定义的单元类,如ActionProfile,其实例由ActionProfileManager管理,它从数据库表中创建实例并将其存储在映射中 然而,如果我想让它更具反应性,那么创建地图会打破单子。我可以做的一种方法是将映射本身设置为可观察的,并返回一个monad来为客户端查找特定的键。然而,中

  • 反应式编程是一种编程范式,用于处理数据流和变化的传播。 这意味着当一个组件发出数据流时,更改将通过响应式编程库传播到其他组件。 变化的传播将持续到最终接收器。 事件驱动和反应式编程之间的区别在于事件驱动的编程围绕事件而反应式编程围绕数据。 ReactiveX或RX用于反应式编程 ReactiveX或Raective Extension是最着名的反应式编程实现。 ReactiveX的工作取决于以下两

  •   函数式反应型编程是两个声明式编程的子范例(函数式+反应式)的组合。这里我们先来理解反应式编程,因为它非常简单。   反应式编程在表处理方面十分强悍。假设我们有一个表格A:她是用来纪录其他两个表格(表格B、表格C)的和。当表格B或C当中任意一个值发现变化时,这些变化都会通过表实时改变表格A的值。总之,我们定义好了A是B和C的和,不管发生了什么,A会一直响应B或C的变化,永远都是B与C的和。   

  • 我对反应式编程有点陌生,我正在尝试组装以下组件:使用Java、Springboot 2、Webflux和reactor core,我想处理需要额外身份验证的非常特定的请求。因此,我通过一系列步骤实现了一个Web过滤器: 捕获请求的路径和方法。检查该组合是否存在,是否需要使用accessPointService进行特定身份验证。getAccessPointAuthorizationRequireme

  • 我正试图在一个Android项目中使用JUnit4,其中我还使用RxAndroid/RxJava。 我所做的是从使用改造UUID生成器调用REST API 乌伊达皮。java只是一个用于改装调用的接口(现在只是其中之一) UUID模型。java,其中初始化了改造,并实现了上面编写的接口 比我有UUID观察者,这只是一个实现观察者的类。 注意:new ToStringConverterFactory

  • 我面临的问题是,有一个服务,我必须调用,这是一个传统的Spring启动应用程序,而不是反应性的! 下面是一个示例endpoint,它接近上述遗留系统的想法: 我知道我不能用这个来实现真正的反应性善,有没有一个快乐的非阻塞和阻塞的媒介我可以在这里实现? 谢谢