Apache Ignite 的分布式原子類型(Atomic Types)

以下的內容是關于 Apache Ignite 的分布式原子類型(Atomic Types),主要包括 IgniteAtomicLongIgniteAtomicReference。它們是 跨集群節點的“全局共享變量”,支持線程安全、原子性操作,即使多個節點同時訪問也能保證數據一致性。

下面我們來深入理解這個功能。


🎯 一、一句話理解

Ignite 的 IgniteAtomicLongIgniteAtomicReference 就像是一個“全宇宙唯一的計數器”或“全局共享變量”,所有集群節點看到的是同一個值,并且可以安全地進行 ++--compareAndSet 等原子操作。

? 類比:

  • 單機版:Java 的 AtomicLongAtomicReference
  • 分布式版:Ignite 的 IgniteAtomicLongIgniteAtomicReference
  • 就像你在 Node A 上加 1,在 Node B 上讀取,也能立刻看到最新值!

🧩 二、核心功能解析

? 1. IgniteAtomicLong —— 分布式原子長整型

IgniteAtomicLong atomicLong = ignite.atomicLong("counter", 0, true);
  • "counter":原子變量的名字(全局唯一標識)
  • 0:初始值
  • true:如果不存在就創建
支持的操作:
方法說明
get()獲取當前值
set(newValue)設置新值
incrementAndGet()先 +1,再返回新值(類似 ++i
getAndIncrement()先返回舊值,再 +1(類似 i++
decrementAndGet()先 -1,再返回新值
addAndGet(delta)加一個數并返回結果
compareAndSet(expected, update)如果當前值等于 expected,則設為 update,返回是否成功
🌰 示例:全局請求計數器
IgniteAtomicLong requestCounter = ignite.atomicLong("httpRequests", 0, true);
long count = requestCounter.incrementAndGet();
System.out.println("Total requests: " + count); // 所有節點共享這個計數

? 多個 Web 節點部署,但請求總數只算一次,不會重復!


? 2. IgniteAtomicReference<V> —— 分布式原子引用

IgniteAtomicReference<String> status = ignite.atomicReference("appStatus", "RUNNING", true);
  • 可以保存任意可序列化的對象(如 String、POJO)
  • 支持 compareAndSet(oldValue, newValue) 實現無鎖更新
🌰 示例:應用狀態切換(防并發沖突)
boolean success = status.compareAndSet("RUNNING", "MAINTENANCE");
if (success) {System.out.println("系統已進入維護模式");
} else {System.out.println("狀態已變更,無法切換");
}

? 避免兩個管理員同時嘗試切換狀態導致覆蓋問題。


🔁 三、為什么需要分布式原子類型?

在分布式系統中,常見的需求包括:

場景問題解決方案
全局 ID 生成多節點生成 ID 沖突AtomicLong 做自增 ID
請求限流/計數各節點獨立計數不準確統一用 AtomicLong 計數
狀態機控制多個節點爭搶修改狀態compareAndSet 保證原子切換
分布式鎖序號給鎖加版本號AtomicLong 生成唯一版本

👉 沒有分布式原子變量 → 數據不一致、競爭條件、邏輯錯誤!


?? 四、Atomic Configuration 配置詳解

可以通過 AtomicConfiguration 對原子類型進行全局配置:

方法說明默認值
setBackups(int)數據備份份數(高可用)0(無備份)
setCacheMode(CacheMode)底層緩存模式:
- PARTITIONED(分片存儲)
- REPLICATED(全節點復制)
PARTITIONED
setAtomicSequenceReserveSize(int)IgniteAtomicSequence 預留的序列值數量(用于批量優化)1000

🌰 示例:創建帶備份的原子變量(防止單點故障)

AtomicConfiguration atomicCfg = new AtomicConfiguration();
atomicCfg.setBackups(1); // 一份備份
atomicCfg.setCacheMode(CacheMode.PARTITIONED);IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setAtomicConfiguration(atomicCfg);Ignite ignite = Ignition.start(cfg);IgniteAtomicLong counter = ignite.atomicLong("safeCounter", 0, true);

? 即使某個節點宕機,數據也不會丟失。


📶 五、工作原理簡析

Ignite 的原子類型底層基于 分布式緩存 + CAS(Compare-And-Swap)協議 實現:

  1. 所有操作都通過網絡發送到 主節點(primary node)
  2. 主節點使用 CAS 保證操作的原子性;
  3. 操作成功后同步給備份節點(如果有);
  4. 客戶端阻塞等待結果返回。

?? 所有操作是 同步的(synchronous),所以會有網絡延遲。


?? 六、性能與注意事項

項目說明
🐢 性能比本地 AtomicLong 慢,因為涉及網絡通信
🌐 延遲受集群大小、網絡質量、并發量影響
🔁 并發高并發下可能出現爭用(contention),建議結合分片使用(如:按用戶分片計數)
💾 持久化默認在內存中;開啟 Native Persistence 可持久化
🧹 清理不再使用時可用 close()remove() 釋放資源
🚫 不適合超高頻寫入場景

比如每秒百萬次 incrementAndGet(),會導致主節點成為瓶頸。此時應考慮:

  • 使用 本地計數 + 定期匯總
  • 使用 Ignite 的 Continuous Queries 或 Events 替代輪詢;
  • 使用 Ignite Compute Grid 批量處理

🧪 七、典型應用場景

場景使用方式
🔢 全局唯一 ID 生成器AtomicLong 自增作為 ID
📊 分布式計數器統計 PV、UV、訂單數等
🛑 分布式限流計數超過閾值則拒絕請求
🔄 狀態機控制compareAndSet 控制服務狀態(RUNNING → STOPPING)
🧩 分布式協調多個節點協作時共享控制變量

? 總結:一句話掌握精髓

Ignite 的 IgniteAtomicLongIgniteAtomicReference 提供了集群范圍內全局可見、線程安全、原子操作的共享變量,讓你像操作本地原子變量一樣實現跨節點的數據同步,是構建分布式協調、計數、狀態管理等功能的利器。


🔄 對比其他技術

技術優點缺點適用場景
Ignite Atomics內嵌、低延遲、API 簡單高并發下有瓶頸中低頻原子操作
ZooKeeper強一致性、高可用復雜、延遲較高分布式鎖、選舉
Redis INCR快、成熟單點風險(除非集群)簡單計數
數據庫自增主鍵熟悉、可靠性能差、有單點強持久化需求

? 如果你已經在使用 Ignite,直接用 IgniteAtomicLong 是最自然的選擇,無需引入額外組件。


如果你想實現一個“分布式 ID 生成器”或“全局限流器”,我可以為你提供完整代碼示例!歡迎繼續提問。

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

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

相關文章

Leetcode 08 java

283. 移動零 提示 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸…

LeetCode 56 - 合并區間

思路 排序&#xff1a;將所有區間按起始點從小到大排序。貪心合并&#xff1a;初始化一個結果列表&#xff0c;放入第一個區間。然后遍歷剩余區間&#xff0c;將當前區間與結果列表中的最后一個區間比較&#xff1a; 若重疊&#xff08;當前區間起點 ≤ 結果區間終點&#xff0…

DNS 正向查找與反向查找

DNS 區域是 DNS 中基本的組織單元&#xff0c;為域名定義了管理和權威邊界。一個 DNS 區域通常包含一系列 DNS 資源記錄&#xff0c;包括名稱到地址的映射&#xff08;正向查找&#xff09;和地址到名稱的映射&#xff08;反向查找&#xff09;。這些區域對于高效管理和解析網絡…

Oracle ERP FORM開發 — 新增查詢條件

1 根據值來查詢具體流程步驟看第2節&#xff0c;這里提供核心的增加查詢條件的觸發器代碼&#xff1a;1.1 可完全匹配的值比如“是”&#xff0c;“否”&#xff0c;“物料”&#xff0c;“”汽車 等等這些可以直接通過對應的值匹配&#xff0c;特點就是詞語&#xff0c;短小。…

Flutter實現列表功能

在Flutter中,可以通過ListView和ListTile等組件來實現類似Android中RecyclerView和Adapter的功能。以下是一個通用的設計架構,用于設計列表數據: 1. 定義數據模型 首先,定義一個數據模型類,用于存儲列表中每一項的數據。例如: class ItemModel {final String title;fi…

2.1、Redis的單線程本質和多線程的操作

Redis的單線程本質 1. 核心單線程部分 #mermaid-svg-iFErSltthPIEsuiP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iFErSltthPIEsuiP .error-icon{fill:#552222;}#mermaid-svg-iFErSltthPIEsuiP .error-text{fil…

文件權限值的表示方法

文章目錄字符表示方法8 進制數值表示方法字符表示方法 Linux表示說明Linux表示說明r--只讀-w-僅可寫--x僅可執行rw-可讀可寫-wx可寫可執行r-x可讀可執行rwx可讀可寫可執行---無權限 8 進制數值表示方法 權限符號8進制2進制r4100w2010x1001rw6110rx5101wx3011rwx7111---0000

【38】WinForm入門到精通 ——WinForm平臺為AnyCPU 無法切換為x64,也無法添加 x64及其他平臺

WinForm 是 Windows Form 的簡稱&#xff0c;是基于 .NET Framework 平臺的客戶端&#xff08;PC軟件&#xff09;開發技術&#xff0c;是 C# 語言中的一個重要應用。.NET 提供了大量 Windows 風格的控件和事件&#xff0c;可以直接拿來使用。本專欄內容是按照標題序號逐漸深入…

門控激活函數:GLU/GTU/Swish/HSwish/Mish/SwiGLU

10 門控激活函數 10.1 GLU&#xff1a;門控線性單元函數Gated Linear Unit10.2 GTU&#xff1a;門控Tanh單元函數Gated Tanh Unit自門控激活函數&#xff08;Self-gated activation function&#xff09;是一種通過自身機制動態調節信息流動的激活函數&#xff0c;其核心在于模…

Linux內核IPv4多播路由深度解析:從數據結構到高效轉發

多播路由是網絡通信的核心技術之一&#xff0c;Linux內核通過精密的多層設計實現了高性能的IPv4多播路由功能。本文將深入剖析其核心實現機制&#xff0c;揭示其高效運轉的秘密。一、核心數據結構&#xff1a;路由系統的基石1. 多播路由表&#xff08;struct mr_table&#xff…

ffmpeg-7.1.1 下載安裝 windows 版,MP4 轉 m3u8 切片,遇到報錯 Unrecognized option ‘vbsf‘的解決辦法

工作中偶爾會需要造指定大小的文檔文件&#xff0c;不要求內容&#xff0c;可以隨意填充任意無毒內容&#xff0c;所以打算用ts文件填充&#xff0c;現記錄下過程。一、下載 ffmpeg廢話不多說&#xff0c;上鏈接&#xff0c;https://ffmpeg.org/會跳轉新頁面&#xff0c;向下拉…

Linux網絡編程:網絡基礎概念(下)

目錄 前言&#xff1a; 一、網絡傳輸基本流程 1.1、認識MAC地址 1.2、認識IP地址 二、socket編程預備 2.1、端口號 2.2、傳輸層的代表 2.3、網絡字節序 2.4、sockaddr 結構 總結&#xff1a; 前言&#xff1a; 大家好&#xff0c;上一篇文章&#xff0c;我們說到了…

亞馬遜廣告進階指南:如何優化流量實現新品快速起量

“新品上架如何快速獲取精準流量&#xff1f;”“如何降低ACOS同時提升轉化率&#xff1f;”“競品流量攔截有哪些高效方法&#xff1f;”“關鍵詞廣告和ASIN廣告如何協同投放&#xff1f;”“人工投放效果不穩定&#xff0c;AI工具真的能解決問題嗎&#xff1f;”如果你也在思…

路徑平滑優化算法--Clothoid 路徑平滑

路徑平滑優化算法–Clothoid 路徑平滑 文章目錄路徑平滑優化算法--Clothoid 路徑平滑0 為什么選 Clothoid&#xff1f;1 數學基礎&#xff1a;嚴謹推導&#xff08;Mathematical Foundation&#xff09;可視化解釋1.1 曲率線性假設1.2 切向角&#xff08;Heading Angle&#…

PCB學習筆記(一)

文章目錄一、PCB的制作過程了解1.1 覆銅板一、核心作用&#xff1a;制作印制電路板&#xff08;PCB&#xff09;二、不同類型覆銅板的針對性用途三、延伸應用1.2 覆銅板和信號線的關系一、覆銅板不是“全是銅”&#xff0c;原始結構是“絕緣基材銅箔”二、信號線就是銅&#xf…

【19】C# 窗體應用WinForm ——【列表框ListBox、復選列表框CheckedListBox】屬性、方法、實例應用

文章目錄9 復選列表框CheckedListBox10. 列表框ListBox10.1 實例&#xff1a;買菜10.2 實例&#xff1a;購菜 應用二WinForm 是 Windows Form 的簡稱&#xff0c;是基于 .NET Framework 平臺的客戶端&#xff08;PC軟件&#xff09;開發技術&#xff0c;是 C# 語言中的一個重要…

新注冊企業信息查詢“數據大集網”:驅動企業增長的源頭活水

商貿繁榮的齊魯大地上&#xff0c;“趕大集”曾是千年傳承的民間智慧。而今天&#xff0c;一場以新注冊企業信息為核心的“數據大集”正悄然重塑商業生態——數據大集網&#xff0c;以“聚天下好數&#xff0c;促萬企互聯”為使命&#xff0c;將分散的企業信息轉化為精準商機&a…

項目目標如何拆解,才能提高執行效率和效果

項目目標要有效拆解以提高執行效率和效果&#xff0c;需要遵循以下關鍵步驟&#xff1a;明確整體目標、劃分階段性目標和里程碑、具體化任務細分并設定優先級、分配明確的責任人和時間節點、持續跟蹤與反饋調整。其中&#xff0c;劃分階段性目標和里程碑尤為重要&#xff0c;通…

spring-ai-alibaba動態 Prompt 最佳實踐

Spring AI Alibaba 使用 Nacos 的配置中心能力來動態管理 AI 應用的 Prompt。以此來實現動態更新 Prompt 的功能。 環境準備 Nacos: 具備配置中心能力的 Nacos&#xff0c;本例中使用 Nacos 3.0.2。Nacos 2.X 亦可&#xff0c; spring-ai版本1.0.0 &#xff0c;spring-ai-al…

基于詞頻統計、關鍵詞提取、情感分析與AI大模型自動生成系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、研究背景與項目意義二、項目目標與研究內容三、系統架構與功能模塊1. AI對話生成模塊2. 分詞與關鍵詞提取模塊3. 情感分析模塊4. 行為預測模塊5. 系統管理模塊6. 可視化展示模塊四、技術…