响应式编程

什么是响应式编程

响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
例如,在命令式编程环境中, a:=b+c表示将表达式的结果赋给 a,而之后改变 b或 c的值不会影响 a。
但在响应式编程中, a的值会随着 b或 c的更新而更新。

响应式编程最初是为了简化交互式用户界面的创建和实时系统动画的绘制而提出来的一种方法,但它本质上是一种通用的编程范式。例如,在MVC软件架构中,响应式编程允许将相关模型的变化自动反映到视图上,反之亦然。

响应式编程的三种模型:

  1. Actor模型, 实现类库:
    • AKKA Actor: Actor模型为编写并发和分布式系统提供了一种更高的抽象级别。它将开发人员从显式地处理锁和线程管理的工作中解脱出来,使编写并发和并行系统更加容易。
  2. 响应式扩展(reactive extensions, Rx)模型, 实现类库:
    • RxJava: Reactive Extensions for Java
    • Reactor: Reactor是Pivotal发布的第四代响应式框架,跟RxJava 2有些相似。 Spring WebFlux 以Reactor为基础,实现Web领域的反应式编程框架。
  3. 函数响应式编程(functional reactive programming, FRP)模型

@Ref 响应式编程 - 维基百科

附: 常用编程范式

响应式系统模型

Actor模型

Actor模型=数据+行为+消息。Actor模型内部的状态由自己的行为维护,外部线程不能直接调用对象的行为,必须通过消息才能激发行为,这样就保证Actor内部数据只有被自己修改。
Actor是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个Actor收到其他Actor的信息后,它可以根据需要作出各种相应。Actor的常见应用模式是处理大规模并发输入流:将具体工作分类给异步的工作节点,之后返回工作节点计算的结果。
Actor模型实际上并不是纯正的函数式编程模型。Receive方法返回Unit类型,这意味着在该方法中,所有事情都是通过副作用完成的。再者,只要需要,Actor模型便会允许使用可变状态,但这里要遵守一个规则,将状态封装在某个actor中,并确保所有状态的响应操作是线程安全的。
综上,Actor模型是处理大规模、高度可用、事件驱动应用程序的更为通用的方法。

函数响应式编程(functional reactive programming,FRP)

在函数响应式编程模型中,基于时间的状态需要通过某一系统传播到需要使用这些状态的代码中。当FRP模型中的某一状态发生变化时,你并不需要手动地对依赖这些变化的变量进行更新,与之相反,FRP会使用声明的方式描述数据元素之间的依赖关系,而FRP运行时则会负责状态的传播。因此,用户使用函数式声明语句和组合语法编写代码。

FRP基本上就是面向异步事件流的编程了,这个异步事件流(Stream)是一个按时间排序的事件序列。Stream是不可变的,任何操作都返回新的Stream,且它是一个Monad。

响应式扩展(reactive extensions,Rx)

Reactive Extension 这个概念最早出现在.net社区的Rx.net,一个提供处理异步事件的程序库,其核心概念是Observable,表示有限或者无限多个现在或者将来到达的事件。Observable提供了onNext,onError,onCompleted供开发者定制新元素到达,出现错误,或者流结束时的程序的行为。并提供了List上类似的操作,如map,filter,reduce,大大降低了异步事件编程的复杂度。
因为这些概念是如此的强大,以至于很多编程语言,如java,ruby,javascript很快就有了各自的reactvie extension。

Rx模型中的可观察序列代表事件流或其他数据源。通过将可观察序列与LINQ(language-integrated query,语言集成查询)库提供的查询操作符(组合器)拼接起来,Rx组成了异步程序。

RxJava ( Reactive Extension for Java ) ,Reactive可以翻译为响应式、反应式。
ReactiveX是Reactive Extensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师Erik Meijer领导的团队开发,在2012年11月开源,
Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,
Rx库支持.NET、JavaScript和C++,现在已经支持几乎全部的流行编程语言,
Rx的大部分语言库由ReactiveX这个组织负责维护,比较流行的有RxJava/RxJS/Rx.NET,社区网站是reactivex.io
RxJava是由Netflix主导做出的提供在JVM上实现Reactive Programming 的一种方式。同类的库还有Project Reactor, Akka 和Google 的 Agera等等。

Reactive Streams

Java 9 新特性:Reactive Streams(响应式流)是一个使用非阻塞back pressure(背压机制)的异步流处理标准。在java.util.concurrent包中提供

Reactor

Reactor是Pivotal发布的第四代响应式框架,跟RxJava 2有些相似。 Spring WebFlux 以Reactor为基础,实现Web领域的反应式编程框架。

RxJava

Reactive Extensions for Java

Akka

Actor模型为编写并发和分布式系统提供了一种更高的抽象级别。它将开发人员从显式地处理锁和线程管理的工作中解脱出来,使编写并发和并行系统更加容易。

Vert.x

Java 异步非阻塞编程框架,底层基于Netty异步通信。Vert.x本身是事件驱动、非阻塞纯异步IO模型,这意味着可以使用很少的线程处理大量并发请求。