您的位置:首页 >综合 >

环球新资讯:Spring 响应式编程,真香!!!

2023-01-18 06:40:28    来源:程序员客栈
一、前言

响应式编程是啥?


(资料图)

为啥要有响应式编程?

响应式流的核心机制是什么?

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后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。

标签: 事件驱动 异步执行 消息传递

相关阅读

精彩放送

市领导开展专题调研全力保障城市供热供水安全

过年白酒选哪个?行家推荐肆拾玖坊、剑南春、汾酒,品质值得信赖!

观速讯丨市农业农村局科技特派员深入企业指导养殖户做好防寒保暖工作

中青漫评|寻找记忆中的“年味”

又得了3个奖!

一只无角、一只独角,沈阳故宫新展出的到底是啥“神兽”?

每日热文:兴齐眼药高层次人才入选沈阳科技计划项目评审专家库

【全球速看料】无证驾驶报废车缉查布控现原形

前沿资讯!农业银行安徽省分行机构业务部原总经理吴叶宏接受纪律审查和监察调查

天天时讯:河北发布2023年省重点建设项目507个

焦点速讯:退租15层写字楼?腾讯回应:办公楼宇的正常调整

贵阳:毕业大学生到筑就业最高可享受9600元租房补贴

【天天时快讯】2022年南宁市推进“项目为王”工作卓有成效

上海一中院一审公开宣判顾威龙等人涉恶势力网络“套路贷”诈骗案

天天看点:白酒板块飘绿 贵州茅台午盘小幅下滑0.03%

巧手捏福兔,指尖传非遗!宝山这场活动超有趣→

环球实时:江门市文化广电旅游体育局提醒:春节出游做好个人防护,确保安全出游

两部门发文:这些个税优惠政策延续!

【世界独家】财政部:进一步做好新阶段疫情防控经费保障

【全球热闻】我国计划2024年发射鹊桥二号中继星

公路养护多举措助力春运保畅通

「三农瞭望」重新认识土特产

环球观点:国家统计局:2022年全年国内生产总值1210207亿元 比上年增长3.0%

2022年,全国人口减少85万人

三胎概念持续走低 洪兴股份盘中跌停

全球通讯!2022年住宅销售额下降28.3%

亚洲酒店节|Kelly-子夫:创新引领酒店价值时代

【环球聚看点】「警方行动」马儿深夜“迷路”交警秒变“牧马人”

热头条丨中国经济2022年成绩单|四季度全国工业产能利用率为75.7%

今日快看!中国经济2022年成绩单|12月发电7579亿千瓦时,同比增长3.0%

新春走基层丨年夜饭预订火热,包厢全满!肘子和红烧肉被抛弃,海鲜受宠

春节出游座驾好选择,瑞虎5x PLUS全球品质,助你用车无忧

【天天时快讯】驻马店市实验幼儿园召开2022年度工作总结会

【焦点热闻】打通“两山”转化路径,做大做强“美丽经济”

节前宠物寄养需求升温,部分宠物店寄养价格上涨

世界观焦点:驻圣克鲁斯总领馆提醒中国公民注意防范登革热疫情

不同的课堂同样的精彩

揭示火山成因之谜、发现新矿物……嫦娥五号发现了这些月球的奥秘

国家乡村振兴局等七部门印发《农民参与乡村建设指南(试行)》

当前热讯:大兴机场国际及地区航班正式复航

环球滚动:精神疾病男子驾车上高速,还带着刀!家属:一旦疾病发作,情绪失控可能会……

天天简讯:2022年我国GDP超121万亿元,比上年增长3.0%

焦点快播:泉州超46万人办理“两病”医保特殊门诊

地利农产品物流园积极协调,应对寒潮天气

贵州台江县长谈“村BA”:在守住“乡土气”的前提下挖掘其文化价值

即时:*ST凯乐:今年第一只退市A股

全球聚焦:2022年812家首店落地北京

天天快讯:警惕“192”冒名京东诈骗

环球观热点:2023年甘肃省艺术类专业统考合格线公布

中信建投均衡成长发行失败 新年首只募集失败公募

全球最资讯丨多款新能源汽车完成冬季测试

热讯:一直“咳咳咳” 会是白肺吗?

世界速讯:台州仙居开展新春“送文化、送温暖、送欢乐”活动

最新:太原新一轮消费券发放汽车补贴也延期

环球快看点丨中央部委密集开会,这份2023“民生清单”将如何影响你我?

当前短讯!手机无网无电也能支付?新功能来了!

全球观焦点:官方批准了!重要国家标准发布!

理想汽车回应:不是灵异事件

【聚看点】丰台站旁再添交通线四合庄西路全线通车

高质量发展特色农业“机器换人”

全球速看:国内首次!河南发现240座北魏皇家仓窖

全球百事通!年夜饭“一桌难求”餐饮消费元气足

世界新动态:澳网首日4名中国网协球员晋级次轮

今日最新!多地多部门打击金融领域非法代理维权——守好消费者钱袋子

热消息:理性消费注重安全

非洲初创企业快速增加

磨刀桑榆到了晚上还是满满的暮色

【环球聚看点】腾讯PCG,反舞弊风暴眼

动态焦点:“慢火车”上赶大集

通讯:走进伊拉克首个汉语水平考试考点

【当前热闻】财务造假!又有A股公司恐被实施重大违法强制退市

天天热议:我国首台高能同步辐射光源增强器全线贯通

15个交易日涨6% 沪指站稳3200点

世界微动态丨广东博智林公司开展建筑机器人研发与应用——助推智能建造转型升级

今日聚焦!新首钢:老厂区玩起新经济

当前速递!华亭镇这些农文旅场所春节期间正常开放→

(社会)我国2022年捐献造血干细胞1968例

【全球时快讯】1月17日“雪游龙”赛道区域首次对外运营

【全球新要闻】全球首个国家!我国国内发明专利有效量超300万件,达量之后往哪“走”?

艾恩伦特引领酱类酿造风向标 能安全智能生产甜面酱、酱油、豆豉

世界观天下!速扩!春节期间,免费!

拟购德威华泰控股权 新动力1月17日起停牌

2023吉林两会·特别聚焦|政府工作报告中,这些与农业相关的重要表述为何引发委员热议?

今日快讯:1月17日“雪游龙”赛道区域首次对外运营

长春市供销社丰农惠民驿站举行助推实体经济发展大会

当前关注:2023年春节期间餐饮安全消费提示!

【天天快播报】乌兰察布冰雪旅游主题系列活动隆重举行

天天快消息!演艺之都建设|传统艺术 从活下来到活得好

【天天新要闻】市人大代表、北京公交集团董事长王春杰: 北京已具备地铁公交一票换乘技术能力

「新春走基层」7515次“慢火车”上“话”年味

鏖战“春节档”!消费贷利率一降再降,释放了何种信号?

全球最新:特步国际:2022年零售销售在中国内地获得中双位数增长

北京银保监局:核准王玉改长城人寿总经理的任职资格

新时代,我在中国丨英国量子力学教授:在中国青年拥有广阔发展空间

每日视讯:春运出行遭遇暴雪怎么办这份个人防范指南请收好

世界快播:过去五年甘肃省人大常委会共办理代表建议2993件

保利发展拟定增募资不超125亿元事宜获保利集团同意

全球微头条丨春节“特供”理财寥寥无几 银行热推开放式产品

天天视点!都快春节了,你告诉我牛市来了?——道达投资手记

世界新资讯:赠险、保费打折……春节将至,看险企如何抓住营销流量密码