文章目录

  • 导言
  • 响应式编程是什么?
  • 响应式宣言
    • 响应式系统应该具有什么特性
    • 什么是弹性? 回弹性?
    • 消息驱动还是事件驱动?
  • 响应式编程相关讨论
    • 为什么使用观察者模式
    • 什么是背压(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的特性还没摸透,但依然在工作岗位上支撑起了一片天。

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

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

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

相关文档

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

一文搞懂: 响应式编程是什么?相关推荐

  1. 一文搞懂 响应式编程是什么

    文章目录 导言 响应式编程是什么? 响应式宣言 响应式系统应该具有什么特性 什么是弹性? 回弹性? 消息驱动还是事件驱动? 响应式编程相关讨论 为什么使用观察者模式 什么是背压(backPressur ...

  2. 一文搞懂go并发编程设计原理

    前言 主要学习其设计原则,大体流程,权衡利弊 不要纠结于部分难懂的实现细节,因为不同的人对相同接口的实现细节不一样,就算是相同的人实现两次也可能不一样 context context的作用主要有两个: ...

  3. 响应式编程以及反应式编程框架Reactor3的简单介绍

    前言 Reactor 3是一个围绕Reactive Streams规范构建的库,它在JVM上引入了响应式编程的一个范例.目前Spring5 引入的Webflux就是reactor 3实现的一个响应式w ...

  4. 阿里专家杜万:Java响应式编程,一文全面解读

    本篇文章来自于2018年12月22日举办的<阿里云栖开发者沙龙-Java技术专场>,杜万专家是该专场第四位演讲的嘉宾,本篇文章是根据杜万专家在<阿里云栖开发者沙龙-Java技术专场& ...

  5. 还搞不明白“响应式编程”,那得看这篇

    响应式编程详解 响应式编程是一种基于异步数据流驱动.响应式.使用声明式范式的编程模型,需要遵循一定的响应式编程开发规范,并且有具体的类库实现.响应式编程基于数据流而不是控制流进行业务逻辑的推进. 响应 ...

  6. 响应式圣经:10W字,实现Spring响应式编程自由

    前言 全链路异步化改造的基础是响应式编程 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多. 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构总体上是全链路 ...

  7. ES6学习——一文搞懂ES6

    ES6学习--一文搞懂ES6 es6介绍 ES全称EcmaScript,是脚本语言的规范,而平时经常编写的EcmaScript的一种实现,所以ES新特性其实就是指JavaScript的新特性. 为什么 ...

  8. IOS响应式编程框架ReactiveCocoa(RAC)使用示例

    本文转载至 http://blog.csdn.net/dfqin/article/details/39164241 IOS ReactiveCocoa RAC 响应式编程 RACSignal Reac ...

  9. 一文搞懂 Traefik2.1 的使用

    原文链接:一文搞懂 Traefik2.1 的使用 一文搞懂 Traefik2.1 的使用 核心概念 安装 ACME 中间件 灰度发布 流量复制 TCP 简单 TCP 服务 带 TLS 证书的 TCP ...

最新文章

  1. 伯克利在《我的世界》举办虚拟毕业典礼,致辞、抛礼帽一样不少!
  2. MySQL数据备份语句
  3. JavaScript编程:文档对象模型DOM
  4. oracle segments,tablespace,and data files
  5. 图片转LaTex公式神器软件
  6. 笔记本内置扬声器三强PK
  7. NetBeans 7.2 beta:更快,更有用
  8. c#下不同命名空间的引用(一个project使用另外一个project的名称空间)
  9. for循环如果先--_乐字节Java循环:循环控制和嵌套循环
  10. 赋值语句的四元式【编译原理】
  11. 硬盘MBR格式转换GPT
  12. Java一些零散知识点--9.19更
  13. uos应用_UOS指标的应用详解
  14. 微积分的历史(二):起源之牛顿
  15. 数字藏品盲盒系统功能开发H5源码搭建
  16. 微信公众号自动回复机器人
  17. 小脚本之windows批量修改文件后缀名
  18. 如何有效促进城市夜游经济发展
  19. 免费SCA工具横向测评
  20. 数学分析教程(科大)——2.3笔记+习题

热门文章

  1. Built-in转URP Chapter10(3)-Fresnel 菲涅尔效果
  2. Vulnhub-OSCP
  3. 优酷的视频地址获取接口
  4. matlab 3维 数据拟合,利用matlab将三维数据拟合成三维曲线
  5. 蓝桥杯练习系统数的读法java_数的读法(蓝桥杯)
  6. 求和符号(Σ,sigma)
  7. CMOS:MOS电容
  8. 中国大学慕课 大连理工大学 C语言程序设计 第11周 结构与共用体
  9. C++使用正则表达式判断GUID格式
  10. Ubuntu常用C语言IDE,ubuntu下两个容易掌握的c/c++ IDE 环境介绍