一文搞懂: 响应式编程是什么?
文章目录
- 导言
- 响应式编程是什么?
- 响应式宣言
- 响应式系统应该具有什么特性
- 什么是弹性? 回弹性?
- 消息驱动还是事件驱动?
- 响应式编程相关讨论
- 为什么使用观察者模式
- 什么是背压(backPressure)
- 个人感想
- 相关文档
导言
目前响应式编程还属于大乱斗的时代,各家有各家的定义和实现。响应式宣言定义了响应式应该满足的特性。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的特性还没摸透,但依然在工作岗位上支撑起了一片天。
对于开发者,不要被互联网上各式各样的“技术营销”骗了,在学习新技术前多想想是不是真的要学。什么代码、什么技术、什么框架,都只是互联网农民工手里的锤子罢了,不是越新越花哨的锤子就越好,能解决实际工作内容的就行。
有时候与其学着各种各样的新技术新框架,不如陪家人看看电影、逛逛街,我们不是互联网的螺丝钉,我们是人,只是恰逢资本主义时代,大多数人都被异化成了“工具人”,但我们都有自己的生活,自己的家人、朋友,每个人都不一样,都有自己的人生。
总而言之,目前市场上响应式编程各种各样,定义五花八门,优点论证也不够充足,大家还是不要急着入场。
相关文档
- http://reactivex.io/intro.html
- GitHub rxjava
- Reactive-Programming-一种技术-各自表述
- 响应式宣言
- 响应式宣言词汇表
一文搞懂: 响应式编程是什么?相关推荐
- 一文搞懂 响应式编程是什么
文章目录 导言 响应式编程是什么? 响应式宣言 响应式系统应该具有什么特性 什么是弹性? 回弹性? 消息驱动还是事件驱动? 响应式编程相关讨论 为什么使用观察者模式 什么是背压(backPressur ...
- 一文搞懂go并发编程设计原理
前言 主要学习其设计原则,大体流程,权衡利弊 不要纠结于部分难懂的实现细节,因为不同的人对相同接口的实现细节不一样,就算是相同的人实现两次也可能不一样 context context的作用主要有两个: ...
- 响应式编程以及反应式编程框架Reactor3的简单介绍
前言 Reactor 3是一个围绕Reactive Streams规范构建的库,它在JVM上引入了响应式编程的一个范例.目前Spring5 引入的Webflux就是reactor 3实现的一个响应式w ...
- 阿里专家杜万:Java响应式编程,一文全面解读
本篇文章来自于2018年12月22日举办的<阿里云栖开发者沙龙-Java技术专场>,杜万专家是该专场第四位演讲的嘉宾,本篇文章是根据杜万专家在<阿里云栖开发者沙龙-Java技术专场& ...
- 还搞不明白“响应式编程”,那得看这篇
响应式编程详解 响应式编程是一种基于异步数据流驱动.响应式.使用声明式范式的编程模型,需要遵循一定的响应式编程开发规范,并且有具体的类库实现.响应式编程基于数据流而不是控制流进行业务逻辑的推进. 响应 ...
- 响应式圣经:10W字,实现Spring响应式编程自由
前言 全链路异步化改造的基础是响应式编程 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多. 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构总体上是全链路 ...
- ES6学习——一文搞懂ES6
ES6学习--一文搞懂ES6 es6介绍 ES全称EcmaScript,是脚本语言的规范,而平时经常编写的EcmaScript的一种实现,所以ES新特性其实就是指JavaScript的新特性. 为什么 ...
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
本文转载至 http://blog.csdn.net/dfqin/article/details/39164241 IOS ReactiveCocoa RAC 响应式编程 RACSignal Reac ...
- 一文搞懂 Traefik2.1 的使用
原文链接:一文搞懂 Traefik2.1 的使用 一文搞懂 Traefik2.1 的使用 核心概念 安装 ACME 中间件 灰度发布 流量复制 TCP 简单 TCP 服务 带 TLS 证书的 TCP ...
最新文章
- 伯克利在《我的世界》举办虚拟毕业典礼,致辞、抛礼帽一样不少!
- MySQL数据备份语句
- JavaScript编程:文档对象模型DOM
- oracle segments,tablespace,and data files
- 图片转LaTex公式神器软件
- 笔记本内置扬声器三强PK
- NetBeans 7.2 beta:更快,更有用
- c#下不同命名空间的引用(一个project使用另外一个project的名称空间)
- for循环如果先--_乐字节Java循环:循环控制和嵌套循环
- 赋值语句的四元式【编译原理】
- 硬盘MBR格式转换GPT
- Java一些零散知识点--9.19更
- uos应用_UOS指标的应用详解
- 微积分的历史(二):起源之牛顿
- 数字藏品盲盒系统功能开发H5源码搭建
- 微信公众号自动回复机器人
- 小脚本之windows批量修改文件后缀名
- 如何有效促进城市夜游经济发展
- 免费SCA工具横向测评
- 数学分析教程(科大)——2.3笔记+习题
热门文章
- Built-in转URP Chapter10(3)-Fresnel 菲涅尔效果
- Vulnhub-OSCP
- 优酷的视频地址获取接口
- matlab 3维 数据拟合,利用matlab将三维数据拟合成三维曲线
- 蓝桥杯练习系统数的读法java_数的读法(蓝桥杯)
- 求和符号(Σ,sigma)
- CMOS:MOS电容
- 中国大学慕课 大连理工大学 C语言程序设计 第11周 结构与共用体
- C++使用正则表达式判断GUID格式
- Ubuntu常用C语言IDE,ubuntu下两个容易掌握的c/c++ IDE 环境介绍