分布式原子序列(Distributed Atomic Sequence)

发布于:2025-07-31 ⋅ 阅读:(23) ⋅ 点赞:(0)

这段内容是关于 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 生成方案之一。


🔹 八、注意事项

  1. ID 不会重复:只要集群正常,保证全局唯一。
  2. ID 可能“跳号”:某个节点宕机时,它预保留但未使用的 ID 会被跳过(为了性能牺牲严格连续)。
  3. 不能递减:只能 incrementAndGet(),不能减少。
  4. 初始值只在第一次创建时有效:第二次再用相同名字创建,会使用上次的值继续递增。
  5. 适合中等频率 ID 生成:超高频场景(如每秒百万级)可能要考虑更专用方案(如 Snowflake)。

✅ 总结一句话:

IgniteAtomicSequence 是一个基于“预保留机制”的分布式递增序列,能在整个集群范围内高效生成唯一 ID,特别适合作为分布式系统的主键生成器。

它通过“一次申请一批,本地快速分配”的策略,在唯一性性能之间取得了非常好的平衡。


如果你正在设计一个分布式系统,并且需要生成数字型、递增、唯一的 ID,那么 IgniteAtomicSequence 是一个非常值得考虑的工具。


网站公告

今日签到

点亮在社区的每一天
去签到