什么是响应式编程

导言

目前响应式编程还属于大乱斗的时代,各家有各家的定义和实现。响应式宣言定义了响应式应该满足的特性。Spring5有自己的响应式方案技术栈、广为人知的rxJava所属的reactiveX也有自己的理解。有的说响应式是基于事件的,有的说是基于数据流的。有人说响应式编程其实只是个便于并发编程的api库,有人说响应式编程是一种编程思想、一种编程范型。技术圈子里各有各的说法,正如小马哥所说: 一种技术,各自表述。响应式编程含糊不清、有些空洞无实、有些夸大其词,难免让普通学习者难以入门,十分头痛。

以下主要基于响应式宣言和reactiveX来解释响应式编程,所说观点如有异议欢迎评论区讨论指教。

响应式编程是什么?

是一款使用异步数据流编程的响应式编程思想。(from here)

Reactive Programming 是基于观察者模型的~这是大家的共识~,它提供了非阻塞、异步的特性,便于处理异步情景,从而避免回调地狱和突破Future的局限性: 难以组合。(这个优点我并不认同,java8 的completeFuture已经有很好的改善了)。

在reactiveX中,对好几个语言提供了api库,该库扩展了观察者模式,支持基于数据事件的驱动。允许声明式组合观察者序列。将同步编程和异步编程抽象成统一。

异步编程和同步编程在代码中的体现可以如下表体现。不同于传统的pull型的,响应式编程通常采用push型的数据传输,由生产者控制消费速度,但当消费者消费速度不足时,也能反过来提示生产者降低生产速度(backPressure),backPressure将在下文阐述。

响应式编程通常带有函数式的思想,但这是用来简化面向对象语法臃肿性的,响应式编程的核心在于Reactive,只是带有了部分的Functional的特性,更不是Functional Reactive Programming,这是完全不同的东西。

响应式宣言

响应式系统应该具有什么特性

当一个系统具有即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动(Message Driven)。 我们称这样的系统为反应式系统(Reactive System)。

img

如图所示,响应式编程的价值在于1. 易于编写维护(特别是异步编程) 2. 及时响应。

什么是及时响应? 不管是出了什么问题,或断电、或网络抖动、或代码bug,都能及时做出响应,提供足够的可用性。

响应式宣言中将异常也看做一种消息来简化对错误的处理,其中错误可以简单看成看做各种Exception。

什么是弹性? 回弹性?

弹性是指不同负载下,系统的吞吐量、响应性没有什么区别。响应式通过伸缩算法,使系统没有资源争用点和中央瓶颈。

回弹性是指当系统出现失败时,例如断电、硬件故障、资源耗尽等情况,通过复制、 遏制、 隔离以及委托来保证依然具有即时响应性。

消息驱动还是事件驱动?

消息时数据,事件是信号。消息的包含的信息量更丰富。

对于消息驱动的系统,如果没有消息来,接受者异步非阻塞等待线程到来(休眠)。

对于事件驱动的系统,常使用回调的方法实现。

响应式宣言中推荐使用消息驱动来设计,因为事件驱动的系统很难实现回弹性:

对于事件驱动系统,当处理过程已经就绪,监听器已经设置好, 以便于响应结果并对结果进行变换时, 这些监听器通常都将直接地处理成功或者 失败, 并向原始的客户端报告执行结果。

(这些监听器)响应组件的失败, 以便于恢复它(指失败的组件)的正常功能,而在另外一方面, 需要处理的是那些并没有与短暂的客户端请求捆绑在一起的, 但是影响了整个组件的健康状况的失败。

响应式编程相关讨论

为什么使用观察者模式

使用该模式将开发者从回调地狱中解放出来。ReactiveX使用流来将异步、同步统一起来,并通过订阅者来将各种操作组合起来,提高了代码易读性。

什么是回调地狱? 其实就是当回调函数需要组合时,常常会使代码复杂度大大增加,代码易读性大大减少的一种现象。

ReactiveX的观察者模式是十分灵活的,不仅仅支持push、还支持pull。

什么是背压(backPressure)

其实背压翻译得不好,叫回压更合适。知乎上有个背压的解说我觉得说得特别好,背压其实只是一种现象,但响应式编程中的backPressure其实是一种解决消费赶不上生产时的一种处理策略,有让生产者慢点push的, 有直接丢弃的...

在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 。

个人感想

在我还是学生的时候就常听人说什么响应式编程、什么webflux,当时被各种新技术迷乱了眼睛的我胡乱的看了几个相关介绍,再听响应式编程被各种各样的博客文章吹嘘的多么多么好、多么多么先进,当时就觉得自己一定要学习。

工作后才发现实际的生产其实不需要多么牛逼先进的东西,大多时候线上系统稳定性才是最重要的。国内java8还是大行其道,好多人java8的特性还没摸透,但依然在工作岗位上支撑起了一片天。

对于开发者,不要被互联网上各式各样的“技术营销”骗了,在学习新技术前多想想是不是真的要学。什么代码、什么技术、什么框架,都只是互联网农民工手里的锤子罢了,不是越新越花哨的锤子就越好,能解决实际工作内容的就行。

有时候与其学着各种各样的新技术新框架,不如陪家人看看电影、逛逛街,我们不是互联网的螺丝钉,我们是人,只是恰逢资本主义时代,大多数人都被异化成了“工具人”,但我们都有自己的生活,自己的家人、朋友,每个人都不一样,都有自己的人生。

总而言之,目前市场上响应式编程各种各样,定义五花八门,优点论证也不够充足,大家还是不要急着入场。

相关文档

  1. http://reactivex.io/intro.html
  2. GitHub rxjava
  3. Reactive-Programming-一种技术-各自表述
  4. 响应式宣言
  5. 响应式宣言词汇表

你可能感兴趣的:(java,响应式编程)