反应式编程
Posted 极客峰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反应式编程相关的知识,希望对你有一定的参考价值。
在本文中,我们讨论了反应式编程背后的一些基本原理,以及如何在Mule运行时中实现它。
根据基维百科(Wikipedia),“反应式编程是一种声明式编程范式,关注数据流和变化的传播” 这个概念在市场上已经存在一段时间了。作为一名开发人员,您可能已经有意或无意地实现了这种方法。
在本文中,我将介绍反应式编程相关的基本概念、方法及其在Mule运行时中的实现。
当项目及其源代码的复杂性增加时,我们通常遵循模块化的概念来开发系统代码。模块化是指先制作多个模块,然后将它们链接组合成一个完整的系统。简单地说,模块化就是划分代码的功能,使其可重用。
这里我们提出了两种方法:
1、被动式编程
2、反应式编程
为了更有效地理解这一点,我们来看一个用例。让我们以一个电子商务系统为例,系统中不同的领域可以互操作。这里,我们有一些在每个电子商务系统中通常会用到的公共模块。
让我们以上面图中的Cart模块和Invoice模块为例,尝试探索开发中的不同方法。
通常,我们必须创建一个更新发票的方法,并且暴露该方法,以便购物车可以修改其值。Cart有一些用于更新发票的方法。在这里,Cart模块操作整个修改过程。因此,我们将把发票中的方法导入到我们的Cart中。这是一种被动编程方法。
但是,我们还有另一个解。
我们可以在购物车中定义相同的功能,而不是在发票中创建方法并将其公开。因此,发票将导入购物车的递增方法如下:
现在,购物车并没有调用发票的任何操作,它只是作为一个广播器。如果任何产品被添加到购物车,它将直接通知到发票。用外行人的话说,如果我想更新“发票”,我应该只在发票中编写代码。这是一种反应式编程方法。
你可能认为没有变化,两者是大致相同的。但是想象一下,你在一个支持项目中,主代码已经完成了,而你带着代码。在被动方法中,要分析“Invoice”的代码,您必须检查导入和操作Invoice的每个方法和模块。
但是,对于反应式的,您的任务会简单得多,因为您仅仅在“Invoice”中定义了功能。在使用反应式方法时,您还可以部分地接近整个代码的模块化。
最佳实践
我想提一下关于反应式方法的利弊。首先,当您必须分析代码片段时,反应式方法是最好的方法。另一方面,当您想要开发可重用代码时,不可能采用反应式方法。然而,这个问题可以通过使用被动响应方法(Passively Reactive approach)来解决。
我们需要开发如下代码:
在这里,我们实现了模块化(代码重用)的功能,以及自解释的特性。
如何识别一个系统是否是反应式的
根据反应式编程声明( Reactive Programing Manifesto),“当系统有4个特征时,就称为‘反应式系统’。”
响应性Responsive:响应性意味着快速和高效。如果一个人可以说系统是响应的,这意味着他/她指的是一个全功能的系统,在被动负载下提供快速和稳定的响应。
弹性Resilient:系统的失败是由错误的用户输入造成的。当系统能够处理每一个故障、任何错误的输入或任何导致系统崩溃的东西时,系统就是“有弹性的”。在这种情况下,我们设计的系统,主要工作单元和故障处理组件是不同的。基于这种方法论,我们可以很容易地实现对系统的理解。
可伸缩性Elastic:“可伸缩”术语意味着无论负载如何,系统都将高效运行。该系统将有效地工作在两种情况下,在充分负载和部分负载。这意味着设计没有争议点或中心瓶颈,从而能够切分或复制组件,并在它们之间分配输入。
异步消息传递Asynchronous Messaging:在实现非阻塞概念时,系统可能依赖于异步消息传递。非阻塞通信允许接收方仅在活动时消耗资源,从而减少系统开销。换句话说,它应该支持非阻塞方法(组件顺利执行的概念)。
Mule运行时是如何反应的?
正如我们现在所知道的,响应式编程声明定义了反应性系统。以上列出了任何反应系统的理想特性。当我们观察Mule的运行时时,我们发现上面的属性,比如对异步消息传递的支持、弹性和错误处理,在都具备。这就是为什么我们可以说Mule ESB遵循了反应式的开发方法。
原题:Reactive Programming
参考:
1)https://www.reactivemanifesto.org/
2)https://www.mulesoft.com/lp/whitepaper/api/reactive-programming
3)https://en.wikipedia.org/wiki/Reactive_programming
以上是关于反应式编程的主要内容,如果未能解决你的问题,请参考以下文章