这段内容是关于 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
是一个非常值得考虑的工具。