這段內容是關于 Apache Ignite 中 分布式信號量(Distributed Semaphore) 的說明和使用示例。我們來一步步解析,幫助你深入理解它的含義和用途。
🔹 一、什么是 Semaphore(信號量)?
在并發編程中,Semaphore(信號量) 是一種經典的同步工具,用于控制對共享資源的并發訪問數量。
- 它內部維護一組“許可”(permits)。
- 線程可以通過
acquire()
方法獲取一個許可(如果還有空閑許可),否則會阻塞等待。 - 使用完資源后,通過
release()
方法歸還許可,供其他線程使用。
👉 Java 標準庫中的例子:
java.util.concurrent.Semaphore semaphore = new Semaphore(3); // 最多允許3個線程同時訪問
semaphore.acquire(); // 獲取許可
try {// 執行臨界區代碼
} finally {semaphore.release(); // 釋放許可
}
這限制了同一時間最多只有 3 個線程能進入臨界區。
🔹 二、Ignite 的分布式信號量是什么?
標準的 java.util.concurrent.Semaphore
只能在單個 JVM 內部起作用。
而 Ignite 的 IgniteSemaphore
是分布式的,意味著:
? 它可以在 整個集群的所有節點之間共享和協調,實現跨 JVM、跨機器的資源訪問控制。
🌐 應用場景舉例:
假設你有一個分布式系統,部署在 5 臺服務器上(5 個 Ignite 節點),你想:
- 同一時間最多只有 2 個節點可以訪問某個外部服務(如數據庫、API 接口等)。
- 或者限制同時執行某項高負載任務的節點數量。
這時就可以用 IgniteSemaphore
來實現集群級別的“限流”或“互斥”。
🔹 三、代碼詳解
Ignite ignite = Ignition.start();IgniteSemaphore semaphore = ignite.semaphore("semName", // 信號量的名字(全局唯一標識)20, // 初始許可數量:最多20個并發許可true, // 是否自動釋放:如果持有許可的節點宕機或退出集群,是否自動回收其持有的許可?true // 如果不存在,是否自動創建?
);
參數解釋:
參數 | 說明 |
---|---|
"semName" | 所有節點通過這個名字找到同一個分布式信號量 |
20 | 最多允許 20 個節點/線程同時持有許可 |
true (failoverEnabled) | 若某個節點崩潰,它之前 acquire 的許可會被自動釋放,避免死鎖 |
true (create) | 如果這個信號量還沒創建過,就新建一個;否則獲取已存在的 |
🔹 四、使用示例分析
// 獲取信號量實例
IgniteSemaphore semaphore = ignite.semaphore("semName", 20, true, true);// 獲取一個許可(如果沒有可用許可,會阻塞等待)
semaphore.acquire();try {// 此時當前節點已獲得許可,可以安全執行受限操作ignite.compute().run(() -> {System.out.println("Executed on:" + ignite.cluster().localNode().id());// 比如調用外部服務、寫文件、處理大數據等});
} finally {// 一定要釋放許可,否則其他節點永遠等不到semaphore.release();
}
? 這段代碼可以在多個節點上并發運行,但最多只有 20 個節點能同時進入 try 塊執行任務。
🔹 五、關鍵特性總結
特性 | 說明 |
---|---|
? 分布式 | 跨多個節點共享狀態,所有節點看到的是同一個信號量 |
? 高可用 | 支持節點故障時自動回收許可(設置 failoverEnabled=true ) |
? 可重入? | ? IgniteSemaphore 不支持可重入(不像鎖那樣可重復進入) |
? 持久化? | 否,它是內存中的協調機制,重啟后狀態丟失(除非你自己持久化) |
🔹 六、常見用途
- 限流控制:限制同時訪問某個外部系統的請求數。
- 分布式任務調度:確保同一時間只有 N 個節點執行某類任務。
- 資源池管理:比如只允許最多 5 個節點連接到某臺舊設備。
- 協調批量作業:防止所有節點同時執行耗時任務導致雪崩。
🔹 七、注意事項
- 獲取許可后必須釋放(建議用 try-finally)。
- 許可數量要合理設置,太小會導致性能瓶頸,太大失去意義。
- 如果
failoverEnabled=false
,某個節點掛了且沒釋放許可,可能導致其他節點永遠阻塞。 IgniteSemaphore
是基于集群通信實現的,有一定網絡開銷,不適合超高頻調用。
? 總結一句話:
Ignite 的
IgniteSemaphore
就像是 Java 標準庫中Semaphore
的“分布式升級版”,讓你可以在整個集群范圍內控制并發訪問的數量,實現跨節點的流量控制與資源協調。
如果你正在構建一個分布式系統,并需要“集群級別的限流”或“協同執行”,那么 IgniteSemaphore
是一個非常實用的工具。