• 分布式系统的ID生成方案


    分布式系统中,唯一标识符(ID)的生成是一个重要的问题。传统的自增长主键在分布式系统中无法直接使用,因为每个节点都有可能生成重复的ID。因此,我们需要设计一种分布式系统中能够生成唯一ID的方案。本文将介绍几种常见的分布式ID生成方案,包括雪花算法、数据库序列、UUID等,并分析其优劣势,并结合 Java 代码和使用场景进行说明。

    1. 雪花算法(Snowflake)

    雪花算法是一种由 Twitter 设计的分布式唯一ID生成算法,它通过将64位的ID分解为不同的部分来保证唯一性。具体来说,雪花算法的64位ID组成如下:

    • 1位符号位(始终为0)
    • 41位的时间戳,精确到毫秒级别
    • 10位的机器ID,用于区分不同的节点
    • 12位的序列号,用于区分同一毫秒内的不同ID

    优势:

    • 高性能:生成的ID是递增的,可以按照时间顺序进行排序。
    • 唯一性:雪花算法生成的ID在分布式系统中几乎是唯一的。
    • 简单易用:实现简单,不依赖于外部系统。

    劣势:

    • 时钟回拨:如果系统时间发生回拨,可能会导致生成的ID不唯一。
    • 单点故障:需要依赖于一个单点的机器ID生成器,可能成为系统的瓶颈。
    1. public class SnowflakeIdGenerator {
    2. private static final long START_TIMESTAMP = 1628251600000L; // 2021-08-06 00:00:00
    3. private static final long MACHINE_ID_BITS = 10L;
    4. private static final long SEQUENCE_BITS = 12L;
    5. private static final long MAX_MACHINE_ID = -1L ^ (-1L << MACHINE_ID_BITS);
    6. private static final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BITS);
    7. private static long machineId;
    8. private static long sequence = 0L;
    9. private static long lastTimestamp = -1L;
    10. public SnowflakeIdGenerator(long machineId) {
    11. if (machineId < 0 || machineId > MAX_MACHINE_ID) {
    12. throw new IllegalArgumentException("Machine ID must be between 0 and " + MAX_MACHINE_ID);
    13. }
    14. SnowflakeIdGenerator.machineId = machineId;
    15. }
    16. public synchronized long generateId() {
    17. long timestamp = System.currentTimeMillis();
    18. if (timesta
  • 相关阅读:
    Android 12(S) 图像显示系统 - HWC HAL 初始化与调用流程
    BERT论文精读
    STL学习笔记之容器
    centos安装Redis
    第一次pta认证P测试C++
    故障排查:maven下载依赖失败(Transfer failed)
    SpringSecurity+ Oauth2.0+JWT 0-1
    【黑马-SpringCloud技术栈】【07】Gateway
    AM62x的SPI总线怎么用?
    strerror函数
  • 原文地址:https://blog.csdn.net/EverythingAtOnce/article/details/136210057