這段內容是關于 Apache Ignite 中的 分布式原子序列(Distributed Atomic Sequence),也就是一個分布式 ID 生成器。我們來一步步深入理解它的原理、用途和使用方式。
🔹 一、核心概念:什么是分布式 ID 生成器?
在分布式系統中,多個節點(服務器)可能同時需要為數據生成唯一的 ID(比如數據庫主鍵、訂單號等)。如果每個節點自己生成 ID,很容易出現重復。
所以需要一個全局唯一、遞增、高性能的 ID 生成機制 —— 這就是 分布式 ID 生成器 的作用。
Ignite 提供了 IgniteAtomicSequence
來解決這個問題。
🔹 二、IgniteAtomicSequence 是什么?
IgniteAtomicSequence
是一個只能遞增的分布式計數器,類似于 Java 中的 AtomicLong
,但它是集群范圍共享的,并且只能向上增長(不能減少)。
它實現了:
- ? 全局唯一性(在整個集群中)
- ? 嚴格遞增
- ? 高性能(通過“預分配”機制)
📌 它非常適合用來做:分布式環境下生成唯一 ID(如主鍵)
🔹 三、核心機制:如何高效生成唯一 ID?——“預保留”機制
這是最關鍵的部分!
?問題:
如果每次調用 incrementAndGet()
都要去集群中同步一次,那網絡開銷太大,性能很差。
?解決方案:批量預保留(Reserve a Range)
Ignite 的 IgniteAtomicSequence
會一次性從集群“預保留”一段連續的 ID 范圍(比如 1000 個),保存在本地節點內存中。
- 下次調用
incrementAndGet()
時,直接從本地取值,無需網絡通信。 - 當本地用完這 1000 個后,再去集群申請下一批。
👉 這樣大大減少了網絡開銷,提升了性能。
🔹 四、關鍵參數:atomicSequenceReserveSize
參數 | 說明 |
---|---|
atomicSequenceReserveSize | 每次預保留多少個 ID |
默認值 | 1000 |
可配置 | 是,通過 AtomicConfiguration.setAtomicSequenceReserveSize(int size) 修改 |
?? 舉例:
- 節點 A 第一次獲取序列時,獲得 [1 ~ 1000]
- 節點 B 同時獲取,獲得 [1001 ~ 2000]
- 兩個節點各自在本地遞增,互不干擾,ID 不會重復
🔹 五、代碼解析
1. 創建分布式序列
Ignite ignite = Ignition.ignite();IgniteAtomicSequence seq = ignite.atomicSequence("seqName", // 序列名稱(全局唯一)0, // 初始值(第一次 increment 后變成 1)true // 如果不存在,就創建
);
"seqName"
:所有節點通過這個名字訪問同一個序列。0
:起始值,下一次incrementAndGet()
返回 1。true
:自動創建,避免重復初始化錯誤。
2. 使用示例:生成 ID
final IgniteAtomicSequence seq = ignite.atomicSequence("seqName", 0, true);for (int i = 0; i < 20; i++) {long currentValue = seq.get(); // 獲取當前值(不增加)long newValue = seq.incrementAndGet(); // 自增并返回新值System.out.println("Generated ID: " + newValue);
}
輸出可能是:
Generated ID: 1
Generated ID: 2
...
Generated ID: 20
? 即使這段代碼運行在多個節點上,生成的 ID 也是全局唯一、連續遞增的!
🔹 六、適用場景
場景 | 說明 |
---|---|
? 分布式主鍵生成 | 替代數據庫自增 ID,在多個微服務或節點間生成唯一主鍵 |
? 訂單編號生成 | 如訂單號 = 時間戳 + sequence,保證全局不重復 |
? 日志追蹤 ID | 分布式系統中生成唯一的 trace ID |
? 緩存版本號 | 用于緩存一致性控制 |
🔹 七、與其它 ID 生成方案對比
方案 | 優點 | 缺點 |
---|---|---|
數據庫自增 | 簡單、可靠 | 性能差、單點瓶頸 |
UUID | 無需協調、高性能 | 太長、非數字、不遞增 |
Snowflake | 高性能、時間有序 | 需要維護機器 ID、時鐘回撥問題 |
Ignite AtomicSequence | 數字遞增、全局唯一、高性能 | 依賴 Ignite 集群、重啟后可能跳號 |
? 如果你已經在用 Ignite,那么
IgniteAtomicSequence
是最簡單可靠的分布式 ID 生成方案之一。
🔹 八、注意事項
- ID 不會重復:只要集群正常,保證全局唯一。
- ID 可能“跳號”:某個節點宕機時,它預保留但未使用的 ID 會被跳過(為了性能犧牲嚴格連續)。
- 不能遞減:只能
incrementAndGet()
,不能減少。 - 初始值只在第一次創建時有效:第二次再用相同名字創建,會使用上次的值繼續遞增。
- 適合中等頻率 ID 生成:超高頻場景(如每秒百萬級)可能要考慮更專用方案(如 Snowflake)。
? 總結一句話:
IgniteAtomicSequence
是一個基于“預保留機制”的分布式遞增序列,能在整個集群范圍內高效生成唯一 ID,特別適合作為分布式系統的主鍵生成器。
它通過“一次申請一批,本地快速分配”的策略,在唯一性和性能之間取得了非常好的平衡。
如果你正在設計一個分布式系統,并且需要生成數字型、遞增、唯一的 ID,那么 IgniteAtomicSequence
是一個非常值得考慮的工具。