關于 Apache Ignite 中 Job 調度(Job Scheduling)與沖突控制(Collision Control) 的機制說明

這段內容是關于 Apache IgniteJob 調度(Job Scheduling)與沖突控制(Collision Control) 的機制說明。我來為你逐段解析,幫助你深入理解其原理和使用方式。


🔍 一、核心概念:Job 調度與 CollisionSpi

在 Apache Ignite 中:

  • 當一個分布式任務(ComputeTask)被提交后,它會被拆分成多個子任務(ComputeJob),這些子任務會被發送到不同的節點上執行。
  • 在目標節點上,這些到達的 Job 并不會立即執行,而是先進入一個“待調度隊列”。
  • 然后由 線程池 來執行這些 Job。
  • 但多個 Job 同時到達時,如何決定誰先執行、誰后執行?這就涉及到了 Job 調度順序問題,也就是所謂的“碰撞處理”(Collision)。

? CollisionSpi(Collision SPI)就是 Ignite 提供的一個 服務提供接口(SPI),用于控制 Job 在本地節點上的調度順序和并發執行策略


🛠? 二、Ignite 內置的 CollisionSpi 實現

Ignite 提供了三種主要的 CollisionSpi 實現:

1. FifoQueueCollisionSpi — 先進先出(FIFO)

  • 行為:按照 Job 到達的順序進行調度,即先進先出。
  • 默認實現:如果你不配置任何 CollisionSpi,Ignite 就會使用這個。
  • 多線程并行執行:雖然順序是 FIFO,但可以有多個線程同時執行 Job。
  • 關鍵參數
    <property name="parallelJobsNumber" value="5"/>
    
    • 表示最多允許多少個 Job 并行執行
    • 默認值 = 2 × CPU 核心數

📌 示例中設置為 1,表示“一次只執行一個 Job”,實現真正的串行化處理。

<bean class="org.apache.ignite.configuration.IgniteConfiguration"><property name="collisionSpi"><bean class="org.apache.ignite.spi.collision.fifoqueue.FifoQueueCollisionSpi"><property name="parallelJobsNumber" value="1"/></bean></property>
</bean>

? 適用場景:需要保證任務按提交順序執行,比如日志處理、事件流等。


2. PriorityQueueCollisionSpi — 優先級調度

  • 行為:根據 Job 的優先級來決定執行順序,高優先級 Job 優先執行。
  • 使用 Java 的優先隊列(PriorityQueue)實現。
  • 仍然支持多線程并行執行(通過 parallelJobsNumber 控制)。
如何設置優先級?

通過在 ComputeTask 中,利用 @TaskSessionResource 注入任務會話,并設置屬性 "grid.task.priority"

public class MyUrgentTask extends ComputeTaskSplitAdapter<Object, Object> {@TaskSessionResourceprivate ComputeTaskSession taskSes;@Overrideprotected Collection<ComputeJob> split(int gridSize, Object arg) {// 設置該任務的優先級為 10(越高越優先)taskSes.setAttribute("grid.task.priority", 10);List<ComputeJob> jobs = new ArrayList<>(gridSize);for (int i = 1; i <= gridSize; i++) {jobs.add(new ComputeJobAdapter() {@Overridepublic Object execute() {// 你的業務邏輯return "Job executed";}});}return jobs;}@Overridepublic Object reduce(List<ComputeJobResult> results) {return null;}
}

?? 注意:

  • 所有屬于該 TaskJob 都會繼承這個優先級。
  • 如果沒有顯式設置優先級,默認值是 0
  • 你可以用負數表示低優先級,正數表示高優先級。

📌 配置示例:

<property name="collisionSpi"><bean class="org.apache.ignite.spi.collision.priorityqueue.PriorityQueueCollisionSpi"><property name="parallelJobsNumber" value="5"/></bean>
</property>

? 適用場景:緊急任務(如報警處理)、VIP 用戶請求、系統維護任務等需要快速響應的場景。


3. JobStealingCollisionSpi(你寫成了 JobStealingFailoverSpi,可能是筆誤)

  • 正確名稱JobStealingCollisionSpi
  • 功能:實現“工作竊取”(Work Stealing)算法。
  • 原理:空閑的節點可以從負載較高的節點“偷”一些 Job 來執行,從而實現更均衡的負載分配。
  • 特別適合動態負載環境或 Job 執行時間差異大的場景。

? 注意:JobStealingFailoverSpi 并不是標準的 CollisionSpi,你可能混淆了 Failover SPI(故障轉移) 和 Collision SPI

? 正確配置方式類似:

<property name="collisionSpi"><bean class="org.apache.ignite.spi.collision.jobstealing.JobStealingCollisionSpi"><property name="waitTimeInMsWhenStealing" value="500"/></bean>
</property>

? 適用場景:異構集群、Job 耗時不均、追求高資源利用率。


?? 三、如何啟用特定的 CollisionSpi?

只需要在 IgniteConfiguration 中設置 collisionSpi 屬性即可:

IgniteConfiguration cfg = new IgniteConfiguration();// 例如啟用優先級調度
PriorityQueueCollisionSpi collisionSpi = new PriorityQueueCollisionSpi();
collisionSpi.setParallelJobsNumber(5);cfg.setCollisionSpi(collisionSpi);// 啟動 Ignite 實例
Ignite ignite = Ignition.start(cfg);

或者使用 Spring XML 配置(如你提供的例子)。


🧠 四、總結對比表

SPI 實現調度策略是否可并行典型用途
FifoQueueCollisionSpi先進先出(FIFO)是(可設線程數)普通任務、順序敏感任務
PriorityQueueCollisionSpi按優先級排序緊急任務、VIP 請求
JobStealingCollisionSpi工作竊取(負載均衡)動態負載、異構環境

💡 五、補充建議

  1. 不要混淆 SPI 類型

    • CollisionSpi:控制 Job 調度順序。
    • FailoverSpi:控制 Job 失敗后是否重試、轉移到其他節點。
    • LoadBalancingSpi:部分功能與 JobStealing 相關。
  2. 性能調優建議

    • parallelJobsNumber 不宜過大,避免線程過多導致上下文切換開銷。
    • 優先級范圍建議定義清晰(如 -10 到 +10),避免濫用高優先級。
  3. 監控支持

    • Ignite Visor 或 JMX 可以查看當前隊列中的 Job 數量、等待時間等,有助于調優。

? 總結一句話:

CollisionSpi 是 Ignite 中用來決定“哪些 Job 先執行、哪些后執行”的調度控制器。你可以選擇 FIFO、優先級或工作竊取等方式,靈活控制任務的執行順序和并發度,以滿足不同業務需求。

如果你正在設計一個高并發、有優先級區分或負載均衡要求的系統,合理配置 CollisionSpi 非常重要!


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

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

相關文章

網絡資源模板--基于Android Studio 實現的課程管理App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情&#xff08;部分) 登錄頁 首頁 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也可…

ROUGE-WE:詞向量化革新的文本生成評估框架

一、ROUGE 基礎與核心局限 ROUGE&#xff08;Recall-Oriented Understudy for Gisting Evaluation&#xff09; 是自動文本摘要與機器翻譯的主流評估指標&#xff0c;由 Chin-Yew Lin 在2004年發表的論文中首次系統提出。其核心變體包括&#xff1a; ROUGE-N&#xff1a;基于…

MGER綜合實驗

一.拓撲二、實驗需求 1、R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有IP地址; 2、R1和R5間使用PPP的PAP認證&#xff0c;R5為主認證方; R2與R5之間使用ppp的CHAP認證&#xff0c;R5為主認證方; R3與R5之間使用HDLC封裝; 3、R1、R2、R3構建一個MGRE環…

高可用集群Keepalived、Redis、NoSQL數據庫Redis基礎管理

1. 總結負載均衡常見的算法 輪詢 (Round Robin)&#xff1a;按順序將請求依次分配給后端服務器&#xff0c;適合服務器性能相近的場景。 加權輪詢 (Weighted Round Robin)&#xff1a;在輪詢的基礎上&#xff0c;根據服務器的權重分配請求。 隨機 (Random)&#xff1a;隨機選…

【深度學習】獨熱編碼(One-Hot Encoding)

獨熱編碼&#xff08;One-Hot Encoding&#xff09; 在機器學習中&#xff0c;數據預處理是不可或缺的關鍵一步。面對各種非數值類型的分類數據&#xff08;Categorical Data&#xff09;&#xff0c;如何將其轉換為機器學習模型能夠“理解”的語言呢&#xff1f;獨熱編碼&…

Promise完全體總結

我們在上篇文章提到了異步會導致無法通過返回值來獲取函數的執行結果&#xff0c;我們通過傳入一個回調函數的方式&#xff0c;以參數的形式獲取到了我們想要獲取的數據&#xff0c;但是這樣如果需要對數據進行多次操作導致形成回調地獄那種不便于閱讀以及護理的代碼。為了解決…

SpringJDBC源碼初探-DataSource類

一、DataSource接口核心作用 DataSource是JDBC規范的核心接口&#xff0c;位于javax.sql包中&#xff0c;用于替代傳統的DriverManager獲取數據庫連接。Spring框架通過org.springframework.jdbc.datasource包對該接口進行了增強&#xff0c;提供連接池管理、事務綁定等高級特性…

C語言(08)——關于指針(逐漸清晰版)

為了更好地理解本篇文章的知識內容&#xff0c;讀者可以將以下文章作為補充知識進行閱讀 &#xff1a; C語言————原碼 補碼 反碼 &#xff08;超絕詳細解釋&#xff09;-CSDN博客 C語言————二、八、十、十六進制的相互轉換-CSDN博客 C語言————斐波那契數列的理解…

LeetCode 1616.分割兩個字符串得到回文串

給你兩個字符串 a 和 b &#xff0c;它們長度相同。請你選擇一個下標&#xff0c;將兩個字符串都在 相同的下標 分割開。由 a 可以得到兩個字符串&#xff1a; aprefix 和 asuffix &#xff0c;滿足 a aprefix asuffix &#xff0c;同理&#xff0c;由 b 可以得到兩個字符串 …

算法【1】

網址&#xff1a;主站 工具補充 1. sort 函數的使用規則 作用&#xff1a;對容器元素進行排序&#xff0c;默認升序。語法&#xff1a;sort(起始迭代器, 結束迭代器, 比較規則) 前兩個參數是排序范圍&#xff1a;[begin, end)&#xff08;包含begin&#xff0c;不包含end&am…

信創國產Linux操作系統匯總:從桌面到服務器,百花齊放

在數字化浪潮席卷全球的今天&#xff0c;操作系統作為信息產業的基石&#xff0c;其戰略地位日益凸顯。曾經由國外巨頭壟斷的格局正悄然改變——中國本土Linux操作系統歷經多年沉淀&#xff0c;已形成了百花齊放的局面。無論是日常辦公、專業開發&#xff0c;還是關鍵行業應用&…

claudia for claude code

一.安裝所有必需的依賴項 1.安裝 Git for Windows 步驟: 訪問 Git 的官方網站 git-scm.com。 下載適用于 Windows 的最新版本安裝程序。 運行安裝程序。在安裝向導的各個步驟中&#xff0c;建議保留所有默認設置&#xff0c;這些設置對于本指南的后續操作已經足夠。 驗證…

企業內外網文件安全傳輸解決方案

企業內外網文件安全傳輸解決方案 基于零信任架構的智能中轉系統設計 一、業務背景與挑戰分析 1.1 企業網絡安全現狀 在數字化轉型浪潮下&#xff0c;企業面臨著前所未有的安全挑戰。傳統的"城墻式"網絡防護已無法滿足現代企業靈活協作的需求。根據《2024年中國企業…

《HCIA-Datacom 認證》希賽三色筆記:詳解 VLAN 間通信的 3 種實現方式

標記說明:&#xffed;掌握內容 &#xffed;次重點 &#xffed;理解內容 在局域網部署中&#xff0c;VLAN 技術通過隔離廣播域提升了網絡安全性和穩定性&#xff0c;但不同 VLAN 間的通信需求又成了新的難題。比如財務部門的電腦&#xff08;VLAN 10&#xff09;需要訪問服務…

Windows 10 系統下的編程字體安裝與配置(VSCode)教程

Windows 10 系統下的編程字體安裝與配置教程 常見的優秀編程字體 開發者社區中有許多備受推崇的編程字體&#xff0c;它們都致力于提升代碼的可讀性和舒適度。以下是一些常見的選擇&#xff1a; Fira Code: 以其豐富的編程連字&#xff08;ligatures&#xff09;而聞名&…

ITIL 4 高速IT:解耦架構——構建快速迭代的技術基座

一、為什么要解耦&#xff1a;從“架構”談到“速度”1.高速IT的真正瓶頸&#xff1a;不是能力&#xff0c;而是架構在我們深入學習ITIL 4 高速IT的時候&#xff0c;大家可能都會有個疑問&#xff1a;為什么有些組織在數字化轉型過程中推得動&#xff0c;有些卻始終難以突破&am…

網絡協議——MPLS(多協議標簽轉發)

一&#xff0c;基本概述1. mpls基本概念MPLS位于二三層之間&#xff0c;可以向所有網絡層提供服務。通過在數據鏈路層和網絡層之間增加額外的MPLS頭部&#xff0c;基于MPLS頭部實現數據快速轉發。2. 控制平面和轉發平面控制平面&#xff1a;負責產生和維護路由信息以及標簽信息…

影刀RPA_初級課程_玩轉影刀自動化_EXCEL操作自動化

聲明&#xff1a;相關內容來自影刀學院&#xff0c;本文章為自用筆記&#xff0c;切勿商用&#xff01;&#xff08;若有侵權&#xff0c;請聯絡刪除&#xff09; 1. 數據的表達 1.1 列表 1.1 獲取一段字符&#xff08;字符串列表的截取 —— 前開后閉&#xff09; 1.2 獲取長…

當貝純凈版_海信ip811n海思mv320處理器安卓4.42及9.0主板優盤免拆刷機固件及教程

海信IP811N安卓4.4.2及安卓9.0主板免拆升級教程 下載固件之前&#xff0c;請拆機確認下主板處理器是否為 海思hi3798mv320處理器&#xff0c;拆機將主板上 位于中心位置的CPU芯片上的黑色貼紙取下 然后查看芯片第二行是否有V32字樣&#xff0c;如下圖 然后進入機頂盒設置&a…

三、平衡橋電路

一、電路結構 由于平衡橋后要連接雙T型橋逆變電路并聯&#xff0c;這里采用平衡橋電路來穩定母線和中線的電壓平衡&#xff0c;使正母線電壓BUS和負母線電壓BUS-相對于中線的電壓大小相等&#xff0c;極性相反&#xff0c;如50VBUS&#xff0c;-50BUS-。 平衡橋電路由兩個電容…