Reactive编程:什么是Reactive编程?Reactive编程思想

news2025/4/1 10:46:13

在这里插入图片描述

文章目录

  • **1. Reactive编程概述**
    • **1.1 什么是Reactive编程?**
      • **1.1.1 Reactive编程的定义**
      • **1.1.2 Reactive编程的历史**
      • **1.1.3 Reactive编程的应用场景**
      • **1.1.4 Reactive编程的优势**
    • **1.2 Reactive编程的核心思想**
      • **1.2.1 响应式(Reactive)**
      • **1.2.2 异步(Asynchronous)**
      • **1.2.3 非阻塞(Non-blocking)**
      • **1.2.4 Reactive宣言(The Reactive Manifesto)**
    • **小结**

在这里插入图片描述


1. Reactive编程概述

1.1 什么是Reactive编程?

在这里插入图片描述

1.1.1 Reactive编程的定义

Reactive编程(响应式编程)是一种面向数据流(Data Stream)变化传播(Change Propagation)的编程范式,它强调系统能够对数据变化做出即时响应,并以异步非阻塞的方式处理数据流。

Reactive编程的核心在于:

  • 数据流驱动:程序逻辑围绕数据流构建,而不是传统的控制流(如顺序执行、循环、条件判断)。
  • 事件驱动:系统对事件(如用户输入、网络请求、传感器数据)做出反应,而不是主动轮询。
  • 声明式编程:开发者关注“做什么”而非“如何做”,代码更简洁、易维护。

1.1.2 Reactive编程的历史

Reactive编程并非全新概念,其思想可追溯至:

  • 1970年代:函数式编程(如Haskell、Lisp)中的惰性求值(Lazy Evaluation)高阶函数(Higher-Order Functions)
  • 1980年代:电子表格(如Excel)中的单元格依赖计算,数据变化自动触发更新。
  • 2000年代:微软推出Reactive Extensions(Rx),将Reactive编程引入主流开发(Rx.NET → RxJava/RxJS)。
  • 2010年代Reactive Streams规范(2015)标准化背压(Backpressure)管理,Spring推出WebFlux,推动Reactive在微服务架构中的应用。

1.1.3 Reactive编程的应用场景

Reactive编程适用于:

  1. 高并发、低延迟系统(如金融交易、实时游戏)。
  2. 大数据流处理(如Kafka、Spark Streaming)。
  3. 前端UI交互(如React/Vue的响应式状态管理)。
  4. IoT(物联网)(传感器数据实时处理)。
  5. 微服务通信(异步消息驱动架构)。

1.1.4 Reactive编程的优势

特性传统编程Reactive编程
并发模型同步阻塞(线程池)异步非阻塞(事件循环)
资源占用高(每个请求一个线程)低(少量线程处理大量请求)
响应速度依赖线程池大小即时响应(无阻塞等待)
代码复杂度回调地狱(Callback Hell)链式调用(可读性高)
扩展性垂直扩展(加服务器)水平扩展(弹性伸缩)

1.2 Reactive编程的核心思想

在这里插入图片描述

1.2.1 响应式(Reactive)

定义:系统能够对数据流的变化外部事件做出即时响应。

关键特性

  1. 事件驱动(Event-Driven)
    • 例如:用户点击按钮 → 触发数据流 → UI自动更新。
    • 代码示例(RxJS):
      button.addEventListener('click', (event) => {
        console.log('Button clicked!');
      });
      
  2. 数据流(Data Stream)
    • 所有数据(变量、用户输入、HTTP响应)都被视为时间序列上的事件流
    • 示例:鼠标移动轨迹可以表示为坐标流 (x1,y1), (x2,y2), ...
  3. 自动依赖跟踪
    • 类似Excel公式,当输入数据变化时,依赖它的计算自动更新。
    • 代码示例(Vue.js):
      const state = reactive({ count: 0 });
      watch(() => state.count, (newVal) => {
        console.log(`Count changed to ${newVal}`);
      });
      

1.2.2 异步(Asynchronous)

定义:操作不会阻塞程序执行,而是通过回调、Promise或流处理结果。

与传统同步代码对比

场景同步代码Reactive异步代码
HTTP请求阻塞线程直到响应返回立即返回,响应到达时通知
文件读取线程等待I/O完成注册回调,I/O完成后触发

异步编程模型演进

  1. 回调函数(Callback) → 回调地狱(Callback Hell)
    fs.readFile('file1.txt', (err, data1) => {
      fs.readFile('file2.txt', (err, data2) => {
        // 嵌套层级深,难以维护
      });
    });
    
  2. Promise → 链式调用,但仍需.then()
    fetch('/api/data')
      .then(response => response.json())
      .then(data => console.log(data));
    
  3. Reactive Streams(Observable) → 更强大的流操作
    Flux.fromIterable(list)
        .filter(item -> item.startsWith("A"))
        .subscribe(System.out::println);
    

1.2.3 非阻塞(Non-blocking)

定义:线程不会因等待I/O(如数据库查询、网络请求)而闲置,而是继续处理其他任务。

实现机制

  1. 事件循环(Event Loop)
    • 如Node.js、Netty的Reactor模式。
    • 单线程处理多任务,通过事件队列调度。
  2. NIO(Non-blocking I/O)
    • Java的Selector、Go的goroutine
  3. 背压(Backpressure)
    • 消费者控制数据流速度,避免生产者过快导致内存溢出。

示例:阻塞 vs 非阻塞

// 阻塞式(传统Java)
Socket socket = new Socket("example.com", 80);
InputStream in = socket.getInputStream(); // 线程卡住直到数据到达

// 非阻塞式(Reactive)
Mono<String> response = WebClient.create()
    .get()
    .uri("http://example.com")
    .retrieve()
    .bodyToMono(String.class); // 立即返回Mono,数据到达时异步处理

1.2.4 Reactive宣言(The Reactive Manifesto)

2014年提出的Reactive系统四大原则:

  1. 即时响应(Responsive):系统快速响应用户请求。
  2. 弹性(Resilient):故障隔离,自动恢复。
  3. 可伸缩(Elastic):根据负载动态扩展。
  4. 消息驱动(Message-Driven):组件通过异步消息通信。

小结

  • Reactive编程是通过数据流异步非阻塞架构构建高响应性系统的范式。
  • 核心思想:响应式(自动响应变化)、异步(非阻塞处理)、数据流(事件序列)。
  • 适用场景:实时系统、高并发微服务、大数据处理等。
  • 演进趋势:从回调→Promise→Reactive Streams,未来与RSocket、协程等结合更紧密。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度剖析:U盘突然无法访问的数据拯救之道

一、引言 在数字化办公与数据存储日益普及的当下&#xff0c;U盘凭借其小巧便携、即插即用的特性&#xff0c;成为了人们工作、学习和生活中不可或缺的数据存储工具。然而&#xff0c;U盘突然无法访问这一棘手问题却时常困扰着广大用户&#xff0c;它不仅可能导致重要数据的丢失…

蓝桥杯-特殊的三角形(dfs/枚举/前缀和)

思路分析 深度优先搜索&#xff08;DFS&#xff09;思路 定义与参数说明 dfs 函数中&#xff0c;last 记录上一条边的长度&#xff0c;用于保证新选边长度大于上一条边&#xff0c;实现三边互不相等 。cnt 记录已选边的数量&#xff0c;当 cnt 达到 3 时&#xff0c;就构成了…

一文详解k8s体系架构知识

0.云原生 1.k8s概念 1. k8s集群的两种管理角色 Master&#xff1a;集群控制节点&#xff0c;负责具体命令的执行过程。master节点通常会占用一股独立的服务器&#xff08;高可用部署建议用3台服务器&#xff09;&#xff0c;是整个集群的首脑。 Master节点一组关键进程&#xf…

wx162基于springboot+vue+uniapp的在线办公小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

Baklib内容中台的核心优势是什么?

智能化知识管理引擎 Baklib的智能化知识管理引擎通过多源数据整合与智能分类技术&#xff0c;实现企业知识资产的自动化归集与动态更新。系统内置的语义分析算法可自动识别文档主题&#xff0c;结合自然语言处理技术生成结构化标签体系&#xff0c;大幅降低人工标注成本。针对…

【C++】C++11介绍列表初始化右值引用和移动语义

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. C11简介2. 统一的列表初始化2.1&#xff5b;&#xff5d;初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 nullptr 4. 范围for循环4.1 范围for的语法4.2 范围for的使用条件 5. STL中一些变化6. 右…

搜广推校招面经六十一

美团推荐算法 一、ANN算法了解么&#xff1f;说几种你了解的ANN算法 ANN 近似最近邻搜索&#xff08;Approximate Nearest Neighbor Search&#xff09;算法 1.1. KD-Tree&#xff08;K-Dimensional Tree&#xff0c;K 维树&#xff09; 类型: 空间划分数据结构适用场景: 低…

人工智能与软件工程结合的发展趋势

AI与软件工程的结合正在深刻改变软件开发的流程、工具和方法&#xff0c;其发展方向涵盖了从代码生成到系统维护的整个生命周期。以下是主要的发展方向和技术趋势&#xff1a; 1. 软件架构体系的重构 从“面向过程”到“面向目标”的架构转型&#xff1a; AI驱动软件设计以目标…

nacos 外置mysql数据库操作(docker 环境)

目录 一、外置mysql数据库原因&#xff1a; 二、数据库准备工作 三、构建nacos容器 四、效果展示 一、外置mysql数据库原因&#xff1a; 想知道nacos如何外置mysql数据库之前&#xff0c;我们首先要知道为什么要外置mysql数据库&#xff0c;或者说这样做有什么优点和好处&am…

【数电】半导体存储电路

组合逻辑电路输入和输出之间是确定关系&#xff0c;与之前的历史记录没有任何关系。时序逻辑电路则有相应的存储元件&#xff0c;要把之前的状态保存起来。 要构成时序逻辑电路&#xff0c;必须要有相应的存储元件&#xff0c;第五章讲述相应的存储元件 一、半导体存储电路概…

Jenkins插件安装失败如何解决

问题&#xff1a;安装Jenkins时候出现插件无法安装的情况。 测试环境&#xff1a; 操作系统&#xff1a;Windows11 Jenkins&#xff1a;2.479.3 JDK&#xff1a;17.0.14&#xff08;21也可以&#xff09; 解决办法一&#xff1a; 更换当前网络&#xff0c;局域网、移动、联通…

postman测试文件上传接口详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman是一个很好的接口测试软件&#xff0c;有时候接口是Get请求方式的&#xff0c;肯定在浏览器都可以测了&#xff0c;不过对于比较规范的RestFul接口&#x…

什么是贴源库

贴源库的定义与核心概念 贴源库&#xff08;Operational Data Store, ODS&#xff09;是数据架构中的基础层&#xff0c;通常作为数据仓库或数据中台的第一层&#xff0c;负责从业务系统直接抽取、存储原始数据&#xff0c;并保持与源系统的高度一致性。其核心在于“贴近源头”…

UE5中开启ACES工作流程

首先要开启OCIO插件 OpenColorIO 创建配置 下载ACES https://github.com/colour-science/OpenColorIO-Configs/tree/feature/aces-1.2-config 加载ACES的ocio 选择Srgb 选择ACES 参考链接: https://zhuanlan.zhihu.com/p/534357694 https://www.youtube.com/watch?vBo3Bvh…

基于springboot+vue的农产品电商平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

解决Dubbo3调用Springcloud接口报No provider available from registry RegistryDirectory

解决Dubbo调用Springcloud接口报No provider available from registry RegistryDirectory 问题发现问题解决 问题发现 在学习Dubbo过程中&#xff0c;Dubbo官网有一篇文章《微服务最佳实践&#xff0c;零改造实现 Spring Cloud & Apache Dubbo 互通》&#xff0c;跟着示例…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

第十四章:JSON和CSV格式详解及Python操作

在数据处理和开发工作中&#xff0c;JSON和CSV是两种非常常见的数据格式。它们各有特点&#xff0c;适用于不同的场景。本文将分别介绍这两种格式的产生原因、应用场景&#xff0c;并结合Python讲解如何操作这两种文件格式&#xff0c;最后用表格总结它们的常用操作及特性。资源…

双磁条线跟踪控制

1问题 同学反馈小车跟随磁力线&#xff0c;双轮差速小车&#xff0c;左右侧各有2个磁条传感器和各1条磁条线&#xff0c;需要控制小车跟随磁条线轨迹。 2 方法 &#xff08;1&#xff09;普通小车可能没有速度反馈&#xff0c;则不考虑转弯半径&#xff0c;仅考虑一个控制关…

树莓派超全系列文档--(7)RaspberryOS播放音频和视频

播放音频和视频 播放音频和视频VLC 媒体播放器vlc GUIvlc CLI使用 cvlc 在没有图形用户界面的情况下播放媒体 在 Raspberry Pi OS Lite 上播放音频和视频指定音频输出设备指定视频输出设备同时指定音频和视频输出设备提高数据流播放性能 文章来源&#xff1a; http://raspberr…