分布式id的生成方案

88 阅读2分钟

在分布式系统中生成唯一的订单号是一个常见的需求,

在我目前工作中的系统中使用的自制的生成流水号方案 使用一个单机服务 内部根据时间戳+业务类型序号+自增id 组合 并通过sync关键字加锁进行生成。由于并发要求不高且是单线程获取sync 所以用sync完全足够(单线程多次获取锁 可以使用偏向锁 大大降低获取锁的损耗)。

为了确保生成的订单号在分布式环境下唯一性,在业内还可以考虑以下几种方案:

  1. 基于数据库自增主键: 使用数据库的自增主键生成订单号,保证了唯一性。每次生成订单时,插入数据库并获取生成的主键作为订单号。但这种方案可能存在单点故障,且对数据库的依赖较高。
  2. UUID(通用唯一标识符): 使用UUID作为订单号。UUID是一个128位的唯一标识符,几乎可以保证全局唯一性。可以使用UUID的各种变体,如UUIDv1(基于时间戳和MAC地址)、UUIDv4(随机生成)等。但UUID作为字符串较长,可能不易于处理和存储。
  3. Snowflake算法: Snowflake是Twitter开源的分布式ID生成算法,它将生成的ID划分为不同的部分,包括时间戳、机器ID和序列号,通过这些部分的组合保证了全局唯一性。Snowflake算法生成的ID通常是64位整数,可以根据需要进行编码和转换。
  4. Redis自增序列: 使用Redis的自增序列生成订单号。Redis的INCR命令可以原子地对一个Key进行自增操作,可作为生成唯一序列号的计数器。每次生成订单时,使用自增序列生成唯一的订单号。

以上方案中,Snowflake算法是一个常用的、高效且具有良好可扩展性的方案,适用于大多数分布式环境。选择合适的方案取决于具体的应用需求、系统架构和性能要求。