一、前言
响应式编程是啥?
为啥要有响应式编程?
(资料图片仅供参考)
响应式流的核心机制是什么?
Spring 响应式编程能解决我们平时开发的什么痛点?
Spring 响应式编程有哪些应用场景?
Spring 响应式编程未来的趋势如何?
开篇六连问,等咱们熟悉完再来真香也不迟,我们废话少说,直接来畅游 Spring 响应式编程的世界。
二、响应式编程是啥?在计算中,响应式编程或反应式编程(Reactive programming)是一种面向数据串流和变化传播的声明式编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
有点抽象?没有关系,老周这就来说道说道。核心的一点响应式编程是声明式编程范式,对命令式编程进行替代的一个范例,这种替代的存在是因为响应式编程解决了命令式编程的限制。大多数开发者都是命令式编程起步的,你写的代码就是一行接一行的指令,按照它们的顺序一次一条地出现。一个任务被执行,程序就需要等到它执行完了,才能执行下一个任务。每一步,数据都需要完全获取到了才能被处理,因此它需要作为一个整体来处理。
命令式编程有个最大的弊端是:当正在执行的任务被阻塞了,特别是一个 IO 任务,例如将数据写入到数据库或从远程服务器获取数据,那么调用该任务的线程将无法做任何事情,直到任务完成。说白了,阻塞的线程就是一种浪费,在如今的环境,线程的资源是那么的宝贵。
相反,响应式编程是函数式和声明式的。响应式编程涉及描述通过该数据流的 pipeline 或 stream,而不是描述的一组按顺序执行的步骤。响应式流处理数据时只要数据是可用的就进行处理,而不是需要将数据作为一个整体进行提供。
三、为啥要有响应式编程?我们上面也说了命令式编程会线程阻塞,而响应式编程是声明式编程范式的,是对命令式编程进行替代的一个范例。
对于命令式编程的同步阻塞,其实业界是有一些处理方案的,比如在 Java 中,为了实现异步非阻塞,一般会采用回调和 Future 这两种机制,但这两种机制都存在一定局限性。
3.1 回调机制我们来看下面这个图:
服务 B 的 methodB() 方法调用服务 A 的 methodA() 方法,然后服务 A 的 methodA() 方法执行完毕后,再主动调用服务 B 的 callback() 方法。回调体现的是一种双向的调用方式,实现了服务 A 和服务 B 之间的解耦。在这个 callback 回调方法中,回调的执行是由任务的结果来触发的,所以我们就可以异步来执行某项任务,从而使得调用链路不发生任何的阻塞。
回调的最大问题是复杂性,一旦在执行流程中包含了多层的异步执行和回调,那么就会形成一种嵌套结构,给代码的开发和调试带来很大的挑战。所以回调很难大规模地组合起来使用,因为很快就会导致代码难以理解和维护,从而造成所谓的“回调地狱”问题。之前公司就遇到代码“回调地狱”问题,十几层的回调,后面的人进来维护估计会吐。
3.2 Future 机制我们再来看看 Future 这种机制,有一个需要处理的任务,然后把这个任务提交到 Future,Future 就会在一定时间内完成这个任务,而在这段时间内我们可以去做其他事情。下面我们来看看来自 Doug Lea 大神在 Java 中的 Future 接口设计:
我们可以看到,大神在上面的设计来达到一定的异步执行效果。但从本质上讲,Future 以及由 Future 所衍生出来的 CompletableFuture 等各种优化方案就是一种多线程技术。多线程假设一些线程可以共享一个 CPU,而 CPU 时间能在多个线程之间共享,这一点就引入了“上下文切换”的概念。如果想要恢复线程,就需要涉及加载和保存寄存器等一系列计算密集型的操作。因此,大量线程之间的相互协作同样会导致资源利用效率低下。
3.3 响应式编程实现方法3.3.1 数据流与响应式数据流就是数据像水流一样源源不断的输入过来,而系统的响应能力就体现在对这些数据流的即时响应过程上。我们可以不采用传统的同步调用方式来处理数据,而是由处于数据库上游的各层组件自动来执行事件,从web到service再到dao层,这个过程就像水流一样,整个数据传递链路都应该是采用事件驱动的方式来进行运作的,这个过程都应该是异步非阻塞的,这就是响应式编程的核心特点。
相较传统开发所普遍采用的“拉”模式,在响应式编程下,基于事件的触发和订阅机制,这就形成了一种类似“推”的工作方式。说白了,就类似现在的 Kafka 等消息引擎,大部分都采用事件驱动的 pub/sub 模式的架构。这种模式的最大优势是生成事件和消费事件的过程是异步执行的,意味着资源之间的竞争关系较少,故服务器的响应能力也就越高。
3.3.2 响应式宣言响应式宣言是一份构建现代云扩展架构的处方。这个框架主要使用消息驱动的方法来构建系统,在形式上可以达到弹性和韧性,最后可以产生响应性的价值。所谓弹性和韧性,通俗来说就像是橡皮筋,弹性是指橡皮筋可以拉长,而韧性指在拉长后可以缩回原样。
响应性: :只要有可能,系统就会及时地做出响应。即时响应是可用性和实用性的基石,而更加重要的是,即时响应意味着可以快速地检测到问题并且有效地对其进行处理。即时响应的系统专注于提供快速而一致的响应时间,确立可靠的反馈上限,以提供一致的服务质量。这种一致的行为转而将简化错误处理、建立最终用户的信任并促使用户与系统作进一步的互动。
韧性:系统在出现失败时依然保持即时响应性。这不仅适用于高可用的、任务关键型系统——任何不具备回弹性的系统都将会在发生失败之后丢失即时响应性。回弹性是通过复制、遏制、隔离以及委托来实现的。失败的扩散被遏制在了每个组件内部,与其他组件相互隔离,从而确保系统某部分的失败不会危及整个系统,并能独立恢复。每个组件的恢复都被委托给了另一个(外部的)组件,此外,在必要时可以通过复制来保证高可用性。(因此)组件的客户端不再承担组件失败的处理。
弹性:系统在不断变化的工作负载之下依然保持即时响应性。反应式系统可以对输入(负载)的速率变化做出反应,比如通过增加或者减少被分配用于服务这些输入(负载)的资源。这意味着设计上并没有争用点和中央瓶颈,得以进行组件的分片或者复制,并在它们之间分布输入(负载)。通过提供相关的实时性能指标,反应式系统能支持预测式以及反应式的伸缩算法。这些系统可以在常规的硬件以及软件平台上实现成本高效的弹性。
消息驱动:反应式系统依赖异步的消息传递,从而确保了松耦合、隔离、位置透明的组件之间有着明确边界。这一边界还提供了将失败作为消息委托出去的手段。使用显式的消息传递,可以通过在系统中塑造并监视消息流队列,并在必要时应用回压,从而实现负载管理、 弹性以及流量控制。使用位置透明的消息传递作为通信的手段, 得跨集群或者在单个主机中使用相同的结构成分和语义来管理失败成为了可能。非阻塞的通信使得接收者可以只在活动时才消耗资源,从而减少系统开销。
问题:消息驱动与上面提到的事件驱动有啥区别呢?
响应式宣言指出了两者的区别:“消息驱动”中消息数据被送往明确的目的地址,有固定导向;“事件驱动”是事件向达到某个给定状态的组件发出的信号,没有固定导向,只有被观察的数据。
在一个消息驱动系统中,可寻址的接收者等待消息的到来然后响应消息,否则保持休眠状态,消息驱动系统专注于可寻址的接收者。响应式系统更加关注分布式系统的通信和协作以达到解耦、异步的特性,满足系统的弹性和容错性,所以响应式系统更倾向于使用消息驱动模式。
在一个事件驱动系统中,通知的监听者被绑定到消息源上。这样当消息被发出时,它就会被调用,所以,响应式编程更倾向于事件驱动。
下一篇老周会来说下响应式流的核心机制是什么?敬请期待~
欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。
-
【快播报】Spring 响应式编程,真香!!!一、前言响应式编程是啥?为啥要有响应式编程?响应式流的核心机制是什么?Spring响应式编程能解决我们平时开发的什么痛点?Spring响应式编程
-
今头条!金岭矿业(000655)1月18日主力资金净卖出79.13万元截至2023年1月18日收盘,金岭矿业(000655)报收于7 2元,上涨2 56%,换手率1 54%,成交量9 16万手,成交额6588 7万元。
-
【环球速看料】【崩坏3】舰长之子的奇妙冒险(4)命悬一线?觉悟之雷的爆发前文戳这里~“……”“少爷?”“喂!你睡着了啊!”意识飘忽间,莱登感到脸庞被狠狠揪住了,“莱登,吃饭了!”“哎?疼!不好意思,有点...
-
[快讯]恒立液压:中国国际金融股份有限公司江苏恒立液压股份有限公司使用募集资金置换预先投入募投项目及已支付发行费用的自筹资金的核查意见-世界快播报CFi CN讯:经中国证券监督管理委员会《关于核准江苏恒立液压股份有限公司非公开发行股票的批复》(证监许可[2022]59号)核准,公司通过非公开
-
随笔|黄朴民:也谈“虽楚有材,晋实用之”-全球速看北京日报客户端|作者黄朴民楚国是春秋战国时期的一个大国。它大部分时间里建都于郢(今湖北江陵),此地居南北中枢,北据汉、沔,接襄汉之上游
-
泡泡玛特王宁内部演讲曝光:把丢掉的时间抢回来“2022年,对于很多人来说都是非常艰难的一年,如何面对之前的寒冬以及未来的春天,都是当下需要思考的命题。”断档三年后,
-
怎么查车辆出没出过事故,汽车有没有事故怎么查询有意向要购买二手车的车主在看车时可以带上一个懂车的人一起试驾,毕竟购买二手车看重的就是其价格的实惠,当你们看到二手车跟显示偏差太大的
-
【天天新视野】暴雪、网易彻底谈崩了!1月23日中止国服游戏服务,妥善封存玩家的“美好回忆"每经编辑:毕陆名网易(HK09999,股价132 6港元,总市值4355亿港元)和暴雪的“分手”事件发酵两个月后,暴
-
重点关注!ACCA报名申请详细流程! 快讯ACCA报名申请详细流程主要有五个步骤,包括:1、填写ACCA注册表。2、注册所需材料。3、交纳ACCA报名注册费。4、到代表处办理。5、ACCA报名注册反馈。
-
科顺股份(300737)1月17日主力资金净卖出2127.18万元截至2023年1月17日收盘,科顺股份(300737)报收于13 69元,下跌0 8%,换手率0 92%,成交量8 17万手,成交额1 12亿元。
-
环球滚动:她因戏生情,三年内生两孩,被称为“最干净”的女星,老公是男神说起明星,其实不要看他们总是表面上光鲜亮丽,其实背地里是有很多艰辛的,大家都觉得他们非常的舒适幸福,受那么多人的追捧,但其实明星也是
-
全球看热讯:哪吒汽车成立浩智增程公司 注册资本4000万天眼查App显示,近日,浩智增程科技(安徽)有限公司成立,法定代表人为彭庆丰,注册资本4000万人民币,经营范围包括汽车零部件研发;电子元器
-
世界新动态:中国首次全尺寸超导航行试验成功,速度超 50 公里 / 小时IT之家1月16日消息,据中国航天科工三院官网消息,1月14日,三院磁电总体部牵头在山西省大同市阳高县高速飞车试验基地,完成了超高速低真空管
-
2023年两条“好消息”,美国没有料到,中国制造高速崛起了!|每日资讯岁末年初很多外媒都对中国的经济进行预测,2023年中国经济将如何起飞,这是全世界都在关心的问题,毕竟中国已经成为了仅次于美国的全球第二大
-
表达心累想哭的句子(推荐277句)|当前视点表达心累想哭的句子推荐78句1 曾经的海枯石烂,终究抵不过一句好聚好散。2 也许,上天不给我的,无论我两臂怎紧扣,仍然走漏;给我的,无论过
-
中国人寿增持并举牌万达信息,国寿集团合计持股超20.3%|全球速递中国人寿增持并举牌万达信息,国寿集团合计持股超20 3%2023年01月16日09:46澎湃新闻作者:胡志挺
-
美媒:已发现涉拜登“文件门”材料约20份|世界讯息参考消息网1月15日报道据美国哥伦比亚广播公司网站1月14日报道,一位了解拜登“文件门”调查进展情况的联邦政府(@参考消息)
-
到2025年我国数据安全产业规模力争超过1500亿元-世界头条新华社北京1月14日电(记者张辛欣)记者14日从工信部获悉,工信部、国家网信办、国家发展改革委等十六部门近日印发《关于促进数据安全产业发展
-
暖心!陕西今年首趟高铁务工专列开行暖心!陕西今年首趟高铁务工专列开行---今天(14日)11时38分,陕西今年首趟高铁务工专列D4207次列车从西安北站发车,前往四川峨眉山。302名在
-
人间烟火气 已是年味浓 看随州年货市场新图景人间烟火气已是年味浓看随州年货市场新图景---紧盯年货经济,随州全力以赴促消费,利好政策不断出台,各路商家摩拳擦掌,形式丰富的促销活动好
-
珠海横琴消费券第二期银联云闪付平台领取规则领取规则(1)自1月16日(周一)起,每天上午10:00,消费者通过进入银联云闪付“横琴消费券”专题页面进行领券。(2)领券用户通过发券平台...
-
优先购买权纠纷律师费如何计算一、按件收费一般无财产争议性质的案件,比如仅解除婚姻关系的离婚案件、抚养权争取案件,都是采取按件收费的标准进行的,根据不同的案情收费
-
云岩区、观山湖区2023年春季转学须知来了_每日快报云岩区教育局关于2023年春季学期转学工作通知根据贵阳市教育局《贵阳市教育局办公室关于规范贵阳贵安义务教育阶段学校转学工
-
12月29日基金净值:汇添富绝对收益定开混合A最新净值1.276,涨0.08%-天天最新12月29日,汇添富绝对收益定开混合A最新单位净值为1 276元,累计净值为1 276元,较前一交易日上涨0 08%。历史数据显示该基金近1个月下跌1 31%
-
南通中医院暂停社会面核酸采样关于暂停社会面核酸采样的公告尊敬的市民朋友:为集中精力做好医疗救治服务工作,自2022年12月30日起,我院暂停西南门核酸采样点社会面核酸采
-
他们报到了!合肥进入“两会时间”!他们报到了!合肥进入“两会时间”!
-
苏州河游船门票价格多少钱一张历时近一年准备,久事集团与普陀区、长宁区、静安区、黄浦区、虹口区等五区携手,联合打造的“悠游苏州河”水上航线,即将于12月15日正式投...
-
全球微动态丨全面深入学习宣传贯彻党的二十大精神|河北涿州:“1+2+N”互动式宣讲让党的二十大精神深入基层日前,在涿州新卓立航空精密科技有限公司会议室内,公司骨干员工正通过投影屏,观看学习“理响涿州”平台上的宣讲云课堂。
-
华泰柏瑞中证智能汽车主题ETF净值下跌2.41% 请保持关注-环球报道金融界基金12月29日讯华泰柏瑞中证智能汽车主题ETF基金12月28日下跌2 24%,现价0 829元,成交723 4万元。当前本基金场外净值为0 8300元
-
描写小学生失败后难过的心情句子(精选240句)描写小学生失败后难过的心情句子精选46句1 风吹过,落叶与我的好心情一起飘零,这深秋的花败正好衬托出我内心的苍凉,放眼望去,已不见绿色,