导言
目前响应式编程还属于大乱斗的时代,各家有各家的定义和实现。响应式宣言定义了响应式应该满足的特性。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)。
如图所示,响应式编程的价值在于1. 易于编写维护(特别是异步编程) 2. 及时响应。
什么是及时响应
? 不管是出了什么问题,或断电、或网络抖动、或代码bug,都能及时做出响应,提供足够的可用性。
响应式宣言中将异常也看做一种消息来简化对错误的处理,其中错误可以简单看成看做各种Exception。
什么是弹性? 回弹性?
弹性是指不同负载下,系统的吞吐量、响应性没有什么区别。响应式通过伸缩算法,使系统没有资源争用点和中央瓶颈。
回弹性是指当系统出现失败时,例如断电、硬件故障、资源耗尽等情况,通过复制、 遏制、 隔离以及委托来保证依然具有即时响应性。
消息驱动还是事件驱动?
消息时数据,事件是信号。消息的包含的信息量更丰富。
对于消息驱动的系统,如果没有消息来,接受者异步非阻塞等待线程到来(休眠)。
对于事件驱动的系统,常使用回调的方法实现。
响应式宣言中推荐使用消息驱动
来设计,因为事件驱动的系统很难实现回弹性:
对于事件驱动系统,当处理过程已经就绪,监听器已经设置好, 以便于响应结果并对结果进行变换时, 这些监听器通常都将直接地处理成功或者 失败, 并向原始的客户端报告执行结果。(这些监听器)响应组件的失败, 以便于恢复它(指失败的组件)的正常功能,而在另外一方面, 需要处理的是那些并没有与短暂的客户端请求捆绑在一起的, 但是影响了整个组件的健康状况的失败。
响应式编程相关讨论
为什么使用观察者模式
使用该模式将开发者从回调地狱
中解放出来。ReactiveX使用流来将异步、同步统一起来,并通过订阅者
来将各种操作组合起来,提高了代码易读性。
什么是回调地狱? 其实就是当回调函数需要组合时,常常会使代码复杂度大大增加,代码易读性大大减少的一种现象。
ReactiveX的观察者模式是十分灵活的,不仅仅支持push、还支持pull。
什么是背压(backPressure)
其实背压翻译得不好,叫回压更合适。知乎上有个背压的解说我觉得说得特别好,背压其实只是一种现象,但响应式编程中的backPressure
其实是一种解决消费赶不上生产时的一种处理策略,有让生产者慢点push的, 有直接丢弃的...
在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 。
个人感想
在我还是学生的时候就常听人说什么响应式编程、什么webflux,当时被各种新技术迷乱了眼睛的我胡乱的看了几个相关介绍,再听响应式编程被各种各样的博客文章吹嘘的多么多么好、多么多么先进,当时就觉得自己一定要学习。
工作后才发现实际的生产其实不需要多么牛逼先进的东西,大多时候线上系统稳定性才是最重要的。国内java8还是大行其道,好多人java8的特性还没摸透,但依然在工作岗位上支撑起了一片天。
对于开发者,不要被互联网上各式各样的“技术营销”骗了,在学习新技术前多想想是不是真的要学。什么代码、什么技术、什么框架,都只是互联网农民工手里的锤子罢了,不是越新越花哨的锤子就越好,能解决实际工作内容的就行。
有时候与其学着各种各样的新技术新框架,不如陪家人看看电影、逛逛街,我们不是互联网的螺丝钉,我们是人,只是恰逢资本主义时代,大多数人都被异化成了“工具人”,但我们都有自己的生活,自己的家人、朋友,每个人都不一样,都有自己的人生。
总而言之,目前市场上响应式编程各种各样,定义五花八门,优点论证也不够充足,大家还是不要急着入场。