Apache Ignite 核心組件:GridClosureProcessor解析

這是一個 Apache Ignite 中非常核心的組件 —— GridClosureProcessor,它是 分布式閉包(Closure)執行的調度中樞,負責在集群節點上異步執行用戶提交的任務(如 RunnableClosure)。

我們來逐層深入理解它的設計思想、關鍵機制和代碼邏輯。


🧱 一、類概覽:GridClosureProcessor

public class GridClosureProcessor extends GridProcessorAdapter
  • 職責:處理所有基于閉包(函數式)的遠程執行請求
  • 常見用途:
    • compute().run(Runnable)
    • compute().call(Closure)
    • compute().broadcast(Closure)
    • cache().affinity().run(...)
  • 它是 ComputeTask 的底層支撐模塊

🔩 二、關鍵字段解析

字段類型作用
poolsPoolProcessor線程池管理器,用于獲取執行任務的線程池
busyLockGridSpinReadWriteLock控制組件在 停止期間不接受新任務
stoppingboolean標記當前處理器是否正在停止

?? 這三個字段共同實現了 “優雅關閉” 的核心邏輯。


🔒 三、busyLock:優雅關閉的關鍵機制

1. 什么是 GridSpinReadWriteLock

  • Ignite 自定義的 自旋讀寫鎖
  • 特點:
    • 讀鎖可重入、允許多個線程同時持有
    • 寫鎖獨占,用于“停止”階段
    • 使用 自旋 + sleep 避免線程頻繁阻塞喚醒

2. 讀鎖(readLock()):

  • 所有任務提交方法(runAsync, callAsync, broadcast)都先獲取讀鎖
  • 表示:“我正在使用這個處理器”
  • 允許多個線程并發提交任務

3. 寫鎖(tryWriteLock(...)):

  • onKernalStop(...) 中使用
  • 目的:阻止任何新任務提交,并標記為“停止中”

🛑 四、onKernalStop(...):優雅關閉流程

@Override
public void onKernalStop(boolean cancel) {boolean interrupted = false;while (true) {try {if (busyLock.tryWriteLock(200, TimeUnit.MILLISECONDS))break;elseThread.sleep(200);}catch (InterruptedException ignore) {interrupted = true;}}try {if (interrupted)Thread.currentThread().interrupt();stopping = true; // 標記為停止狀態}finally {busyLock.writeUnlock();}
}

🔍 流程詳解:

  1. 嘗試獲取寫鎖

    • tryWriteLock(200ms):嘗試在 200ms 內獲取寫鎖
    • 如果有線程持有讀鎖(即正在提交任務),則失敗
    • 失敗后 Thread.sleep(200),然后重試
  2. 為什么是“Busy Wait”?

    • 注解 @SuppressWarnings("BusyWait") 表示這是有意為之的忙等待
    • 目的:盡快完成關閉,避免長時間阻塞
    • 每 200ms 嘗試一次,不會過度消耗 CPU
  3. 處理中斷

    • 如果等待期間被中斷,記錄 interrupted = true
    • 最后恢復中斷狀態(線程安全最佳實踐)
  4. 設置 stopping = true

    • 獲取寫鎖后,設置標志位
    • 之后所有 runAsync 等調用都會被拒絕
  5. 釋放寫鎖

    • 即使發生異常,也確保釋放鎖

? 這是一個典型的 “關閉守衛”模式:先阻止新請求,再清理資源。


🚀 五、任務提交方法分析

所有任務提交方法都遵循統一模式:

busyLock.readLock();
try {if (stopping) reject();// 提交任務
} finally {busyLock.readUnlock();
}

我們以 runAsync(...) 為例:

? runAsync(...):運行一批 Runnable

public ComputeTaskInternalFuture<?> runAsync(...) {assert mode != null;assert !F.isEmpty(jobs);busyLock.readLock(); // 獲取讀鎖try {if (stopping) {return finishedFuture(new IgniteCheckedException("Closure processor cannot be used on stopped grid"));}if (F.isEmpty(nodes))return finishedFuture(U.emptyTopologyException());ctx.task().setThreadContext(TC_SUBGRID, nodes);return ctx.task().execute(new T1(mode, jobs), null, sys, execName);}finally {busyLock.readUnlock(); // 釋放讀鎖}
}
關鍵點:
  • stopping 檢查:如果正在停止,直接返回失敗 future
  • nodes 檢查:拓撲為空則返回空拓撲異常
  • ctx.task().execute(...):交給 TaskProcessor 執行(T1 是一個內部任務類型)
  • 使用 sys 參數決定使用 系統線程池 還是 公共線程池

? callAsync(...):遠程調用 Closure

public <T, R> ComputeTaskInternalFuture<R> callAsync(IgniteClosure<T, R> job, T arg, ...)
  • 執行一個帶返回值的函數(Closure<T,R>
  • 返回 ComputeTaskInternalFuture<R>,可獲取結果

? broadcast(...):廣播到所有節點

public <T, R> IgniteInternalFuture<Collection<R>> broadcast(...)
  • nodes 列表中的每個節點上執行 job
  • 返回一個 Future<Collection<R>>,包含所有節點的返回值

? affinityRun(...):基于數據親和性執行

public ComputeTaskInternalFuture<?> affinityRun(...)
  • 關鍵用途:將任務發送到 特定緩存分區(partition)的主節點
  • 流程:
    1. 獲取當前拓撲版本 readyAffinityVersion()
    2. 使用 ctx.affinity().mapPartitionToNode(...) 找到負責該分區的節點
    3. 只在那個節點上執行任務
  • 優勢:本地化執行,避免數據移動,性能極高

💡 這是 Ignite 實現“移動計算而非數據”的核心機制之一。


🧩 六、T1, T8, T11, T4 是什么?

這些是 內部任務類(定義在 GridTaskInternalFuture 或內部類中),用于包裝用戶任務:

任務類包裝的任務類型
T1GridClosureCallMode + Collection<Runnable>
T8IgniteClosure<T,R>
T11Broadcast 任務
T4Affinity 任務

它們都繼承自 ComputeTaskAdapter,由 TaskProcessor 調度執行。


🎯 七、整體架構圖(簡化)

+---------------------+
|  User Code          |
|  compute().run(...) |
+----------+----------+|v
+---------------------+
| GridClosureProcessor|
| - busyLock          |
| - stopping          |
+----------+----------+|v
+---------------------+
|  TaskProcessor      |
|  execute(Task)      |
+----------+----------+|v
+---------------------+
|  PoolProcessor      |
|  系統/公共線程池     |
+---------------------+

? 八、設計亮點總結

特性說明
讀寫鎖控制關閉讀鎖允許多任務并發提交,寫鎖確保關閉時原子性
優雅拒絕新任務stopping 標志 + finishedFuture 快速失敗
支持多種執行模式單節點、廣播、親和性執行
與 Task 子系統集成復用 TaskProcessor 的調度能力
線程安全所有提交路徑都受鎖保護
可觀測性調試日志、異常信息清晰

📌 九、一句話總結

GridClosureProcessor 是 Ignite 的 分布式任務調度入口,它通過 讀寫鎖機制 實現了 高并發提交 + 優雅關閉,并支持 普通執行、廣播、數據親和性執行 等多種模式,是 Compute 子系統的核心引擎。


💡 十、你可以借鑒的設計模式

1. 關閉守衛模式(Shutdown Guard)

private final ReadWriteLock shutdownLock = new ReentrantReadWriteLock();
private volatile boolean shuttingDown = false;public void submit(Runnable task) {shutdownLock.readLock().lock();try {if (shuttingDown) throw new RejectedExecutionException();// 執行任務} finally {shutdownLock.readLock().unlock();}
}public void shutdown() {shutdownLock.writeLock().lock();try {shuttingDown = true;} finally {shutdownLock.writeLock().unlock();}
}

2. 快速失敗(Fail-Fast)

  • 不讓任務進入隊列,而是在入口就拒絕
  • 返回一個“已完成的失敗 Future”,避免資源浪費

🏁 結語

GridClosureProcessor 雖然代碼量不大,但它體現了分布式系統中 資源管理、并發控制、生命周期管理 的最佳實踐。理解它,有助于你設計自己的 高可用、可擴展的任務調度系統

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92661.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92661.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92661.shtml

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

相關文章

for循環詳解與實戰技巧

目錄 一、for循環語法 二、for循環執行流程 流程圖表示&#xff1a; 三、for循環實踐示例 示例&#xff1a;在屏幕上打印1~10的值 四、while循環與for循環對比 for循環和while循環都包含三個關鍵部分&#xff1a; 兩者的主要區別在于代碼組織方式&#xff1a; 五、練習…

winform中的listbox實現拖拽功能

文章目錄前言一、實現前言 winform中的listBox實現拖拽&#xff01; 一、實現 winform中的listbox實現拖拽只需要實現四個事件 1、準備兩個listbox控件 其中listtarget&#xff0c;AllowDrop屬性設置為True。 2、實現四個事件 2.1MouseDown //在 MouseDown 事件期間&#x…

用 Docker 安裝并啟動 Redis:從入門到實戰

用 Docker 安裝并啟動 Redis&#xff1a;從入門到實戰Redis 作為一款高性能的鍵值對數據庫&#xff0c;在緩存、會話存儲、消息隊列等場景中被廣泛應用。本文將詳細介紹如何使用 Docker 快速安裝和啟動 Redis&#xff0c;包括基礎配置、數據持久化以及容器管理等核心操作&#…

ansible學習第一天

一&#xff1a;ansible基礎知識1.1 ansible的定義與工作原理簡述ansible是一個自動化運維工具&#xff0c;用于執行自動化任務&#xff0c;包括像配置管理&#xff0c;應用部署&#xff0c;任務執行等等&#xff0c;本質上來說也是基礎設施及代碼工具&#xff0c;通過可讀性較強…

Vue原理與高級開發技巧詳解

Vue 的底層原理、高級用法、性能優化和生態整合 文章目錄Vue 的底層原理、高級用法、性能優化和生態整合一、Vue 雙向綁定原理深度剖析1. Vue 2 實現原理&#xff08;Object.defineProperty&#xff09;2. Vue 3 實現原理&#xff08;Proxy&#xff09;3. v-model 高級用法二、…

axios的封裝

axios的封裝 在src目錄下新建文件夾utils工具類&#xff0c;文件夾里面新建http.js文件&#xff0c;如果項目涉及到多個基地址可以新建http2.js文件。 import axios from axios;/*** 后端*/// 創建axios實例 const http axios.create({// 1.接口基地址baseURL: http://192.168…

MariaDB 數據庫管理與web服務器

MariaDB 數據庫管理與WEB 服務器 介紹 MariaDB 數據庫介紹 **數據庫&#xff0c;是一個存放計算機數據的倉庫。**這個倉庫是按照一定的數據結構來對數據進行組織和存儲的&#xff0c;我們可以通過數據庫提供的多種方法來管理其中的數據。 數據結構&#xff0c;是指數據的組織形…

分治-歸并-912.排序數組-力扣(LeetCode)

一、題目解析1、將數組排升序2、在不使用任何內置函數的情況下解決問題二、算法原理分治-歸并合并兩個有序數組1、雙指針遍歷兩個合并數組2、將比較后的較小值放到新開數組中3、防止有指針未遍歷完&#xff0c;特殊處理4、將nums中的元素還原三、代碼示例vector<int> tmp…

網絡安全初學者學習心得

看到你對網絡安全學習的興趣&#xff0c;我感到非常振奮&#xff01;這個領域既充滿挑戰又回報豐厚&#xff0c;作為初學者&#xff0c;理清學習內容和方向確實至關重要。下面我將結合多年的行業觀察和指導經驗&#xff0c;為你詳細拆解網絡安全初學者的學習內容并分享一些核心…

防火墻筆記優化版

一、防火墻的核心定義防火墻是一種基于預設安全策略&#xff0c;用于隔離內網與外網、控制網絡流量的安全系統&#xff08;可分為軟件系統或硬件系統&#xff09;。其核心作用包括&#xff1a;流量隔離&#xff1a;物理或邏輯分隔內網、外網及 DMZ 區域&#xff08;DMZ 為內網與…

vue3前端項目cursor rule

cursor rule是什么&#xff0c;以及怎么定義&#xff0c;看這個文章&#xff1a; cursor中定義cursor rules_cursor rules如何編寫-CSDN博客 針對現有一個vue3的前端項目&#xff0c;寫了一份cursor rule&#xff0c;可以作為參考&#xff0c;內容如下&#xff08;僅作為參考&…

基于51單片機紅外遙控定時開關智能家電插座設計

1. 功能介紹 本設計是一款基于 STC8C52 單片機 的智能家電插座系統&#xff0c;集 紅外遙控控制、定時開關控制、自動與手動模式切換、掉電數據保存、液晶顯示、蜂鳴器提示 于一體&#xff0c;能夠方便用戶對家用電器進行精準的定時控制與遠程操作。系統廣泛適用于家用電器、辦…

下一代防火墻組網方案

知識回顧&#xff1a;1.傳統防火墻包括包過濾防火墻、應用網關防火墻、狀態檢測防火墻。2.包過濾防火墻工作在3、4層。3.包過濾防火墻特點&#xff1a;4.應用網關防火墻主要作用&#xff1a;①截取用戶初始化連接請求&#xff0c;對用戶進行認證&#xff1b;②通過ALG能讓多通道…

WEB開發-第二十七天(PHP篇)

DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS開發 PHPStorm : 專業PHP開發IDE PhpStudy &#xff1a;Apache MYSQL環境 Navicat Premium: 全能數據庫管理工 變量覆蓋安全&#xff1a; $GLOBALS&#xff1a;這種全局變量用于在PHP腳本中的任意位置訪…

Lwip深度閱讀-網絡架構

LWIP網絡協議棧詳細介紹 本文的內容基本基于野火的LWIP手冊&#xff0c;和LWIP源碼撰寫。 網絡協議棧概述 從圖片可以看出&#xff0c;網絡協議棧采用分層架構&#xff0c;每一層都有特定的功能和協議。 TCP/IP協議分層模型數據封裝過程MAC數據包 我使用wireShark抓包的時候&am…

嵌入式系統學習Day16(C語言中的位運算)

位運算二進制位的運算嵌入式:通過位運算 控制 硬件運算: 運算規則 & 與 一假則假 | 或 一真則真 ~ 非 真假相對 ^ 異或 相同為假 不同為真 << 左移 表示二進制位的移動 >> 右移 eg:int a 0x55; int b 0x33;0101 0101 //0x55 &am…

Endnote下載,導入曼大 harvard_manchester格式

下載endnote 并激活中國農業科技文獻與信息服務平臺&#xff0c;點擊下載 下載harvard_manchester 格式 Harvard Manchester - Referencing guide at the University of Manchester - Subject guides at University of Manchester 雙擊打開第二步下載的安裝包&#xff08;使用…

【Docker進階實戰】從多容器編排到集群部署

Docker進階實戰&#xff1a;從多容器編排到集群部署 當你已經熟悉Docker的基本操作后&#xff0c;面對的下一個挑戰往往是&#xff1a;如何管理多個容器的協作&#xff1f;如何實現容器的集群化部署與擴展&#xff1f;如何保證服務的高可用&#xff1f; 一、Docker Compose&…

【Linux文件操作】文件操作系統調用

目錄 一、文件創建&#xff08;creat 系統調用&#xff09;? 1.1 函數原型 1.2 參數說明? 1.3 返回值? 1.4 使用示例 二、文件打開&#xff08;open 系統調用&#xff09;? 2.1 函數原型 2.2 參數說明? 2.3 返回值? 2.4 使用示例 三、文件讀寫&#xff08;read 和 write …

FreeRTOS源碼分析六:vTaskDelay vs xTaskDelayUntil任務延時

系列文章目錄 FreeRTOS源碼分析一&#xff1a;task創建&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析二&#xff1a;task啟動&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析三&#xff1a;列表數據結構 FreeRTOS源碼分析四&#xff1a;時鐘中斷處理響應流程 Free…