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

在這里插入圖片描述

文章目錄

  • **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.pswp.cn/pingmian/73813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73813.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異步轉同步,實現一個消息隊列

有一個場景&#xff0c;需要實現一個消息隊列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其實考察的是怎么用同步的方式實現異步。 本文總結了四種方式實現&#xff1a;常規嵌套、prom…

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望 #微服務實戰 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事務 #Seata #ServiceMesh #總結 #SpringCloud #SpringBoot 系列終章&#xff1a;經過前九篇 [【深度 Mape 系列】] 的系統學習…

求職筆試題

PDD 最長公共子序列 1143-最長公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二維動態規劃"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 這種寫法錯誤&#xff0c;m1行…

【MySQL基礎-16】MySQL DELETE語句:深入理解與應用實踐

1. DELETE語句基礎&#xff1a;數據刪除的藝術 在數據庫管理中&#xff0c;DELETE語句是維護數據完整性和清理過期信息的關鍵工具。與日常生活中的"刪除"不同&#xff0c;數據庫中的刪除操作需要更加謹慎和精確&#xff0c;因為數據一旦刪除&#xff0c;恢復可能非常…

python學習筆記(3)——元組

Python3 元組全面詳解 一、元組的定義與特性 基本概念 元組(Tuple)是Python中的不可變序列,用小括號()表示,元素用逗號分隔。與列表不同,元組一旦創建,元素不能修改、添加或刪除(元素本身為可變對象的情況除外)。 不可變性 ? 元組的每個元素的引用不可變,但若元素是可…

Android 中實現一個自定義的 AES 算法

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ 前言 AES&#xff08;Advanced Encryption Standard&#xff0c;高級加密標準&#xff09; 是一種 對稱加密算法&#xff0c;用于加密和解密數據。AES 由 美國…

小河:團隊金牌精準計劃

【趨勢識別與預測】 數據趨勢分析在隨機序列研究中首要價值在于識別潛在規律并提升預測能力。隨機序列常表現為無規則波動&#xff0c;但通過滑動平均、指數平滑、小波變換等方法&#xff0c;可剝離噪聲干擾&#xff0c;提取長期趨勢或周期性成分。例如&#xff0c;在金融時間序…

S32K144外設實驗(七):FTM輸出多路互補帶死區PWM

文章目錄 1. 概述1.1 時鐘系統1.2 實驗目的2. 代碼的配置2.1 時鐘配置2.2 FTM模塊配置2.3 輸出引腳配置2.4 API函數調用1. 概述 互補對的PWM輸出是很重要的外設功能,尤其應用再無刷電機的控制。 1.1 時鐘系統 筆者再墨跡一遍時鐘的設置,因為很重要。 FTM的CPU接口時鐘為SY…

數據結構與算法:算法分析

遇到的問題&#xff0c;都有解決方案&#xff0c;希望我的博客能為您提供一點幫助。 本篇參考《Data Structures and Algorithm Analysis in C》 “在程序設計中&#xff0c;不僅要寫出能工作的程序&#xff0c;更要關注程序在大數據集上的運行時間。” 本章討論要點&#xf…

Redis數據持久化機制 + Go語言讀寫Redis各種類型值

Redis&#xff08;Remote Dictionary Server&#xff09;作為高性能的鍵值存儲系統&#xff0c;憑借其豐富的數據類型和原子性操作&#xff0c;成為現代分布式系統中不可或缺的組件。 1、Redis支持的數據類型 Redis支持的數據類型可歸納為以下9類&#xff1a; String&#x…

排序--歸并排序

一&#xff0c;引言 歸并排序作為七大排序中一種&#xff0c;本文將講解其排序原理和代碼實現。 二&#xff0c;邏輯講解 來看一組動圖&#xff1a; 首先先進行大邏輯的講解&#xff0c;在一個亂序的數組中如圖&#xff1a; 通過遞歸進行一次次分組如圖&#xff1a; 分組邏…

React程序打包與部署

===================== 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 為生產環境準備React應用最小化和打包環境變量錯誤處理部署到托管服務部署到Netlify探索高級主題:Hooks、Su…

Spring Data審計利器:@LastModifiedDate詳解(依賴關系補充篇)!!!

&#x1f552; Spring Data審計利器&#xff1a;LastModifiedDate詳解&#x1f525;&#xff08;依賴關系補充篇&#xff09; &#x1f50c; 核心依賴解析 使用LastModifiedDate必須知道的依賴關系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…

接口測試中數據庫驗證,怎么解決?

在接口測試中&#xff0c;通常需要在接口調用前后查詢數據庫&#xff0c;以驗證接口操作是否正確影響了數據庫狀態。?這可以通過數據庫斷言來實現&#xff0c;PyMySQL庫常用于連接和操作MySQL數據庫。?通過該庫&#xff0c;可以在測試中執行SQL語句&#xff0c;查詢或修改數據…

游戲引擎學習第189天

今天的回顧與計劃 在昨天&#xff0c;我們花了一些時間來優化調試數據的收集方法&#xff0c;并且在調試界面中增加了一些界面代碼&#xff0c;使得我們可以懸停在不同的元素上&#xff0c;查看相關信息。今天的任務是對這些數據進行更多的操作&#xff0c;進行一些有趣的實驗…

智能粉塵監測解決方案|守護工業安全,杜絕爆炸隱患

在廠房轟鳴的生產線上&#xff0c;一粒微小粉塵的聚集可能成為一場災難的導火索。如何實現粉塵濃度的精準監控與快速響應&#xff1f;我們為您打造了一套"感知-預警-處置"全閉環的智能安全方案&#xff01; 行業痛點&#xff1a;粉塵管理的生死線 在金屬加工、化工…

Java 實現將Word 轉換成markdown

日常的開發中&#xff0c;需要將word 等各類文章信息轉換成格式化語言&#xff0c;因此需要使用各類語言將word 轉換成Markdown 1、引入 jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&g…

Axure設計之中繼器表格——拖動行排序教程(中繼器)

一、原理介紹 在Axure中實現表格行的拖動排序&#xff0c;主要依賴于中繼器的排序事件。然而要實現拖動效果&#xff0c;就必須結合動態面板&#xff0c;因為動態面板可以設置拖動事件&#xff0c;之所以使用動態面板或許是因為它可以更靈活地處理位置變化。用戶拖動行時&…

分布式渲染與云渲染:技術與應用的黃金搭檔

一、核心概念&#xff1a;先區分再關聯 分布式渲染是通過多臺設備并行計算拆分渲染任務的技術&#xff08;如將一幀拆分為 64 個小塊&#xff0c;64 臺電腦同時渲染&#xff09;&#xff1b; 云渲染是基于云計算的渲染服務&#xff0c;本質是分布式渲染的商業化落地—— 用戶無…

鼠標在客戶區內按下左鍵和雙擊右鍵

書籍&#xff1a;《Visual C 2017從入門到精通》的2.6鼠標 環境&#xff1a;visual studio 2022 內容&#xff1a;【例2.44】鼠標在客戶區內按下左鍵和雙擊右鍵 1.創建一個單文檔程序 一個簡單的單文檔程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…