响应式编程介绍

响应式编程详解 响应式编程 (reactive programming) 是一种基于数据流 (data stream) 和 变化传递 ,以“非阻塞”和“异步”为特性,采用函数式的语法,实现并发执行效率。统一了java并发编程模型,使同步与异步的实现代码无明显差异。 阅读详情

响应式,也称之为 反应式,是在构建高并发异步处理系统逐步总结出来的一套软件模型。

1、响应式宣言

说起响应式,就不得不先说下响应式宣言-Reactive Manifesto

在响应式宣言中阐述了『响应式系统』该有的特质以及实现手段:

总结来说 就是 一个响应式的系统,需要具备在服务正常或者异常的情况下,都需要及时的对外部请求做出响应,响应可以是正常内容也可以是异常情况下的 fast throw,借助于消息驱动或者事件驱动来达到系统内部异步非阻塞的交互机制,这通常需要系统服务各个分层各个组件都是响应式的。

其中 即时响应和消息驱动是侧重点,实现消息驱动的方式非常多,在这样的背景下需要有一套实现规范,所有的响应式编程框架都应该按照规范进行设计与实现

2、响应式编程

响应式编程的实现,基本是以 响应式标准规范实现的,当然也有些例外,比如 akka stream。

2.1、Reactive Stream

Reactive Stream,响应式规范,即响应式流,是一个异步Stream 的响应式规范标准,它定义了实现响应式编程时的 API(类似于 JDBC 标准 API),囊括多种语言,其中 JVM 平台的API 定义见 reactive-streams-jvm

在 API 中可以看到有四种角色:

Publisher:事件发布者

Subscriber: 事件订阅消费者,定义了消费的一般模式,onSubscribe onNext* (onError | onComplete)?

Subscrition: 表示一次消息生产到消费的关系,是一个消息的声明周期

Processor:从类继承来看,它既是订阅者也是发布者,表示一个处理的阶段

从这些角色也可以看到,发布者订阅者,这和我们常见的消息中间件 以及 异动任务处理的方式都非常像。

2.2、响应式编程

响应式编程的核心思想 是在 数据流 上,一切皆为流,数据流的变化传递体现在数据流处理节点流转时,即在生产者只负责产生并发的数据流事件,而由消费者来监听订阅并定义处理并发事件的变化传递方式,这其中要求各个步骤都是使用异步的、消息驱动的方式处理任务,这样才会节省性能。

总结来说,响应式就是一种基于 数据流和变化传递的声明式编程范式。

声明式我们在函数式编程中接触的也比较多了, java8 stream 里lamba 和各种函数的组合都可以认为是声明式的编程典型。

背压(回压)

在数据流的处理方式上,一般有两种方式,推和拉(这和大部分流的处理方式一样,比如 Feed 流的写扩散和读扩散),拉模式是消费者主动从生产者拉取数据,推模式是生产者主动推送数据给消费者,相较于拉模式,数据处理的资源利用率会更好,但是如果当生产者和消费者速度不一致时,那么就需要一种反馈机制达到流控的目的,背压就是这样的一种下游能够向上游反馈流量请求的一种机制。

背压是响应式编程中核心特质,一般是出现在有 buffer 上限的系统中,当出现 Buffer 溢出的时候,也就是下游消费跟不上,数据就会在传输管道中积压,就会对上游形成压力,也就是产生了 Backpressure。

2.3、一些响应式框架

在响应式宣言中说了构建响应式系统最基本的手段是基于消息驱动来实现异步非阻塞的数据流处理,那么在非阻塞的处理模型上有大量的框架实现,如 RxJava,Akka),Vert.x,Reactor。

其中Akka 是 scala 编写的以 Actor 模型(强调消息不变性,一切皆是 Actor)为基础的高性能事件驱动可伸缩并发处理框架,Actor是一个封装了状态和行为的对象,Actor之间可以通过交换消息的方式进行通信。

Vert.x 也是用于构建响应式应用的全栈式web 框架,采用事件驱动的异步工作模式,在典型的分布式领域如微服务中,性能可能是最好的,但是貌似国内好像用的不多,我也没用过,感觉不太活跃。

而 Reactor 和 RxJava 是实现了响应式规范最出名的两个框架,具体来说是 基于 Reactive Stream API 实现的。

Reactor

据官网介绍Reactor 是基于 Reactive Stream 的第四代响应式编程库,而SpringWebflux也是基于 Reactor 实现的,背靠 Spring,在 reactor 中核心的类有两个 Flux 和 Mono,分别代表多个数据和单个数据。

RxJava

RxJava 是ReactiveX项目中的Java实现,早于Reactive Streams规范,但是使用的术语有所不同,之前是在 android 里比较火,方便了 IO 线程和 UI 线程来回切换,从 api 来看,这就是扩展的观察者模式,在 rxjava 中主要的类是 Completable,MayBe,Single,Observable,Flowable。

SpringWebflux

基于 Reactor3 构建,虽然官网上说了 springweblufx 的目标一般不是为了加快应用,而是为了解决在高并发场景下使用更少的线程更少的资源来达到更低的 cpu load,占用更小的内存,获得更好的弹性负载。总结来说,解决了在高并发下IO 密集场景下的线程资源问题。

官网给的对于 springmvc 和 springwebflux 的建议中,其中有一点是要用户更多从技术原理(非阻塞 IO、并发性能、吞吐量)来评估 WebFlux 以及在团队内学习使用的成本来评估,可以看出不能无脑用,收益也需要根据实际评估。

下面看个例子,一个结合 server-sent的时钟 demo。

顺便提下,RSocket 的java 实现也是基于 reactor 支持了响应式。(RSocket 是一个构建在 tcp 上的支持多路以及全双工通信的应用层协议,有机会不妨用 roscket-java 替代 http 体验下)

之前我们都是行走在 servlet 的世界,现在开始拥抱reactive 的世界把。(boot3也发布了,主要支持AOT 和GraalVM,基于 spring6,虚拟线程也来了)

应用层有 webflux 的支持,那么其他比如 dao,cache 层也有响应式的框架实现了。

比如 spring-data 系列中的spring-boot-starter-data-redis-reactive、spring-boot-starter-data-mongodb-reactive等

最为关注的 jdbc 也有对应的支持了,r2dbc.io/ (Reactive 本来不支持 JDBC,最根本的原因是,JDBC 不是 non-blocking 设计)

这里粘下官网例子:

在JDK9 中初步提供了响应式编程的规范实现: (ava.util.concurrent.Flow)[[docs.oracle.com/javase/9/do…]

JDK9中的 Flow 接口,从下图可以看到 只有一个 Flow 接口,在 concurrent 包下,其他四个类都是内部类,使用非常方便,可以在 jdk http 包下看到很多内部应用。

总结:

在项目中替换旧有的组件并集成这些响应式的组件并不困难,问题是即使你替换了那你的应用很可能也不是响应式的系统。我之前替换过这些组件,且不说替换之后的很多隐藏的问题,就查询处理性能效果来说,并没有发生多大的改变,后来我才明白,就像刚开始提的,一个响应式的系统要求系统中各个部分都需要响应式的提供服务,而不是某个组件,一条响应式链路中某个节点如果只能同步阻塞,那么这条链路他就不是响应式的,由此带来的问题就是改造一个现有的系统为响应式,那将是一个巨大的灾难。使用反应式编程模型并不自动意味着反应式系统或反应式架构,单对于构建异步非阻塞的程序将是非常有利的。

响应式编程的好处就是执行的代码和执行的线程是分开的,通过这种方式来进行异步编程,但是因为响应式编程以及调试复杂度很高,也在不断优化寻求新的线程模型,比如协程,project loom就是在这样的背景下产生的一种新的线程并发模型。异步,不只有线程、future 和回调。

响应式的世界里,离不开异步非阻塞的讨论,这里的异步指的是什么?非阻塞呢?有必要弄清楚。

Java响应式编程 本章将从响应式编程的开始,从 stream 开始逐步递进,如对流式编程或响应式编程十分熟悉的可直接跳过对应小节。本章内容因目前使用有限,仅供参考,目前也不必花费过多时间在该章内容上,待未来使用时再深入研究即可。本章内容可作为 webflux 学习的前置知识。 阅读详情

相关推荐

介绍Java中的响应式编程(Reactive Programming)

在 Java 中,反应式编程已经成为了一个备受关注的技术。反应式编程是一种声明式编程范式,它借鉴了函数式编程和面向对象编程的思想,用于处理异步和事件驱动的数据流并保持响应能力。反应式编程是一种处理异步操作和事件驱动数据流的编程范式。在传统的编程模型中,我们通常使用命令式编程来处理数据流,即需要对一系列步骤进行显式的调度和控制。但是,在反应式编程中,我们将数据流看作是一个响应式系统,由事件驱动的数据流组成。这些数据流可自我管理,实时更新自身状态并将数据流交给其他数据流进行处理。

一名Java语言狂热分子。 3819

Java:理解java响应式编程

理解java响应式编程

netyeaxi的专栏 1万+

局域网tcp通信实验

IPv4 地址 . . . . . . . . . . . . : 192.168.92.79。IPv4 地址 . . . . . . . . . . . . : 192.168.92.59。子网掩码 . . . . . . . . . . . . : 255.255.255.0。子网掩码 . . . . . . . . . . . . : 255.255.255.0。使用这篇文章的小工具。

weixin_51883798的博客 434

响应式编程(Reactive Programming)介绍

在互联网上有着一大堆糟糕的解释与定义。Wikipedia 一如既往的空泛与理论化。Stackoverflow 的权威答案明显不适合初学者。Reactive Manifesto 看起来是你展示给你公司的项目经理或者老板们看的东西。微软的 Rx terminology"Rx = Observables + LINQ + Schedulers" 过于重量级且微软味十足,只会让大部分人困惑。

qq_32907491的博客 3820

保姆级教程:在Windows 10/11上安装配置KNIME 5.8.0(含中文文本库更新)

本文提供在Windows 10/11系统上安装配置KNIME 5.8.0的详细指南,包括中文文本库更新和性能优化方案。从环境准备、安装流程到中文文本处理能力强化,逐步指导用户搭建高效的数据分析环境,特别针对国内网络环境和中文用户需求提供实用解决方案。

weixin_29081101的博客 670

MOOS-ivp 实验三 MOOS简介(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_44151170的博客 7434

一、响应式编程基本介绍

什么是响应式编程?

散落的博客 1万+

vba 修改下拉列表_Excel联想式下拉菜单制作教程II

?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下...

weixin_39593718的博客 1576

响应式编程入门介绍

前言:在学习的过程中,能在许多地方见到响应式编程的影子,Java中的Reactor,服务器部署的Nginx,Vert.x框架等等.由此可见,响应式编程该思想值得我们学习一下响应式编程的典范---电子表格电子表格是响应式思想的典范在Excel中,我们通常会使用公式来建立起不同格之间的联系例如:当该表格的A值发生改变时,会影响到B格,再影响到C格将A列的数据想象成一个数据流,每一个数据的到达都会触发一个事件,右侧的单元格则会同时改变这些就是反应式的核心思想维基百科对响应式的定义如下:响应式编程 (reactiv

manfulshark的博客 613

《AgentScope-Java 深入浅出教程》第10章 RAG 知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与文本生成相结合的技术架构。它通过从外部知识库中检索相关文档,将检索到的信息作为上下文注入到语言模型的提示中,从而增强模型的回答质量。│ RAG 工作流程 ││ ││ 用户问题 向量检索 上下文增强 生成回答 ││ ▼ ││ │ A │ ││ ││ 1. 接收问题 ││ 2. 将问题转换为向量,在知识库中检索相似文档 ││ 3. 将检索到的文档作为上下文添加到提示词中 │。

步子哥的博客 462

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1182

响应式编程-基本介绍

响应式宣言() 对响应式系统进行了定义:响应式系统是具备以下特质即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动()的系统。响应式是一种思维模式,核心在于异步和非阻塞。最初起源于IO模型的Reactor模型,并形成理念产生了各类响应式框架,贯穿整个系统使用的编程模式,从系统接受输入开始到完成完整的系统功能输出结果的完整过程中都是响应式的。图1主从多线程模型的Reactor线程模型。

dreamsofa的专栏 1742

【开发必备插件】iframe嵌套报“拒绝连接请求”的本地解决方法

关键词:iframe 拒绝连接、X-Frame-Options、Chrome 插件、前端调试、Allow X-Frame-Options前几天我在本地项目里调试一个第三方网站的嵌入页面时,遇到了一个非常经典的报错:xxx.com 拒绝了我们的连接请求。熟悉的老前端们一眼就知道——这是。但对于日常开发来说,我们经常需要在本地测试 iframe 嵌套外部页面(比如嵌第三方登录页、支付页、可视化报表系统等)。而线上站点配置了或DENY时,就会直接导致 iframe 加载失败。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1542

java响应式编程_java中的响应式编程介绍

java中的响应式编程介绍发布时间:2020-06-22 14:46:27来源:亿速云阅读:132作者:Leah这篇文章将为大家详细讲解有关java中的响应式编程,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。响应式编程作为响应式编程方向上的第一步,微软在.NET生态系统中创建了Rx库(Reactive Extensions)。RxJava是在JVM上对它的实现。...

weixin_36437103的博客 599

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3951

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WebFlux 响应式编程介绍及简单实现

文章目录WebFlux 响应式编程介绍及简单实现1、响应式编程概述2、基于Java8及之前版本的实现3、基于 Reactor 实现 WebFlux 响应式编程介绍及简单实现 1、响应式编程概述 背景知识 为了应对高并发服务器端开发场景,在2009 年,微软提出了一个更优雅地实现异步编程的方式——Reactive Programming,我们称之为响应式编程。随后,Netflix 和LightBend 公司提供了RxJava 和Akka Stream 等技术,使得Java 平台也有了能够实现响应式编程的框

万里顾一程的博客 3611

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring响应式编程之Reactor介绍

响应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式。Java中的Reactor是一个用于响应式编程的库,它建立在Reactive Streams规范之上,旨在帮助开发者构建非阻塞的、高效的、具有弹性的应用程序。

个人学习所用博客,记录日常学习的过程。 2121

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

响应式编程框架ReactiveCocoa介绍与入门

ReactiveCocoa是Github团队开发的第三方函数式响应式编程框架,在目前市面上的很多iOS App都大量使用了这个框架。以下我简称这个框架为RAC.我下面会通过几篇博客来和大家一起学习这个强大的框架。该博客的案例代码已经上传至  https://github.com/chenyufeng1991/ReactiveCocoaDemo 。当然最好的学习方式是去阅读RAC的源码,Github

乞力马扎罗的雪CYF的博客 1万+

响应式编程优点 有效_Java响应式编程RxJava简单介绍

原文:https://www.cnblogs.com/WoodJim/p/5970937.htmlRxJava简介Rx(ReactiveX,响应式编程)是一种事件驱动的基于异步数据流的编程模式,整个数据流就像一条河流,它可以被观测(监听),过滤,操控或者与其他数据流合并为一条新的数据流。而RxJava是.Net Rx在JVM上的实现。RxJava可以应用于大部分基于JVM的语言,如Scala,Gr...

weixin_40006963的博客 195

同步、异步、响应式编程介绍

随着互联网用户规模的扩大,应用架构从单一应用演变为微服务架构,其中服务间通过RPC或HTTP通信,导致I/O成为性能瓶颈。传统阻塞架构使用多线程处理请求,但线程资源昂贵且上下文切换耗时,高并发下易导致系统负载激增。异步架构通过非阻塞代码提高CPU利用率,减少线程创建和上下文切换,提升效率。响应式编程通过流式处理和操作符简化异步编程,解决回调地狱和Future组合困难的问题,但调试复杂且易出现资源泄漏。对于I/O密集型应用,异步架构和响应式编程能显著提升性能,但需权衡操作复杂性和调试难度。

赶路人儿 323
上一篇: 深入浅出Redis,这是我见过最好的Redis实践文档
下一篇: 原理 +实战,手把手教你搭建一整套的微服务系统
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值