在不处理慢速IO时,从性能角度使用反应式编程是否有意义?

时间:2017-07-27 06:49:50

标签: java reactive-programming project-reactor

在处理慢速IO时,或者当您想要将结果流回最终用户时,使用反应式编程,例如Java和Project Reactor非常有意义。你编写的代码看起来更清晰 - 类似于使用Functional Programming和Streams时 - 但你也被迫以不同的方式编写内容,这使得那些不熟悉这个概念的程序员的生活更加艰难。

我想知道从一般的性能角度来看是否有意义?如果一个程序没有任何I / O,除了一些屏幕输出(比如计算无限的PI数字或Fibonacci序列),它会不会减慢你的计算速度?或者代码清洁度的提高是否会产生很小的代价呢?

3 个答案:

答案 0 :(得分:2)

这取决于您要解决的问题 - 但是如果您只是从严格的性能角度来看待它?可能不是,但是......

  • 每一个新的概念/范例在开始时都被认为是艰难的 总是很难改变一种思维方式来吸收这种思维方式 概念上的变化。
  • Reactive不应该解决性能问题(除非你做了很多事情 阻塞)但由于异步消息驱动架构,提高了系统的整体响应能力/可扩展性/弹性。
  • 通过使用声明式方法,您可以实现真正的控制反转(是的,不仅仅是依赖注入)使用反应式编写的代码 方法看起来不同但更简单因为你抽象出处理异步计算,线程管理,调度,并行数据流的组合,背压等,并且不需要自己处理(想象一下后面的重构)

因此,经典的异步方法是处理慢速IO的解决方案。反应式方法远不止于此。

答案 1 :(得分:0)

据我所知,反应式编程不仅仅是关于性能也是关于可伸缩性的,当你知道你的应用程序对未来有越来越大的需求并且你计划你的架构时,你想要使用被动编程。处理那个。除了反应式编程之外,还有其他一些技术,如微服务或SOA来处理这些问题。

在我看来,使用这种策略完全取决于问题,因为根据(你/你的团队)经验开发这种架构,没有什么是免费的,通常开发时间也会更长。

要将数据发送到您的客户端,您可以使用其他技术,例如轮询或将数据推送到您发布更新数据的网络套接字或队列/主题。

答案 2 :(得分:0)

一般来说,不同的范例适用于不同的问题,可能的事实是问题是通过这些范例的组合来解决的。这是Brian Goetz关于它的轻量级talk。你不能概括“在计算PI时处理缓慢的I / O和FP时使用RP”或类似的东西。

你在这里接触几个完全正交的科目。

  

您编写的代码看起来更清晰

完全取决于语言的语法及其提供的功能。 Java有JavaFX绑定API,它可以使Java在Java中非常干净,但如果没有它,它看起来会非常混乱。例如,在语言A中,结果不与其参数绑定,如果您确实希望它具有反应性,则必须说明:

a = b + c;
b = b + 1; // a doesn't change
a = react(b + c);
b = b + 1; // a increases by 1

因此RP在这种语言中更加混乱。在语言B中它是相反的 - 结果默认绑定,如果你不想要你必须指定它,所以实现RP不那么混乱,但实现别的东西更麻烦。

  

但是你也被迫以不同的方式写东西,这使得那些不熟悉这个概念的程序员的生活更加艰难。

与任何范例一样。当OO出现时,情况不一样吗?想想一直在做FP的人,现在他们需要阅读OO代码。他们的生活更加艰难。

  

我想知道从一般的性能角度来看是否有意义?

为什么不呢?使用延迟计算,您几乎没有性能问题。在上面的代码示例中,如果未使用a的值,则每次更改bc时都不需要更新a。将伪代码react视为指定公式 - “当您需要a的值时执行此操作” - 而不是作为常量关系 - “必须始终为此”。

这也是JavaFX绑定的作用。连续更新所有绑定值会非常昂贵。无论何时发生读取操作,然后只更新该值并将其返回。

问题是:应该值对变化做出反应,而不是这样做是否更易于阅读或具有更好的性能。