articleList

21-分布式ID生成器Snowflake里面的坑

2025/03/13 posted in  ShardingJDBC
Tags: 

  • 分布式ID生成器需求 - 性能强劲

    • 全局唯一不能重复
    • 防止恶意用户规矩id的规则来获取数据
  • 全局唯一不能重复-坑

    • 坑一
      • 分布式部署就需要分配不同的workId, 如果workId相同,可能会导致生成的id相同
    • 坑二
      • 分布式情况下,需要保证各个系统时间一致,如果服务器的时钟回拨,就会导致生成的 id 重复
        • 啥时候会有系统回拨????
          • 小滴课堂-老王闲着,人工去生产环境做了系统时间调整,应该不会这么傻吧
          • 业务需求,代码里面做了系统时间同步
  • 配置实操

    • 配置workId
      spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1
    • 方式一:订单id使用MybatisPlus的配置,ProductOrderDO类配置
     @TableId(value = "id",type = IdType.ASSIGN_ID)
     private Long id;
    
    • 方式二:使用Sharding-Jdbc配置文件,注释DO类里面的id分配策略
    # id生成策略
    spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
    spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE
    
  • 进阶:动态指定sharding jdbc 的雪花算法中的属性work.id属性

    • 使用sharding-jdbc中的使用IP后几位来做workId, 但在某些情况下会出现生成重复ID的情况
      • 解决办法时:在启动时给每个服务分配不同的workId, 引入redis/zk都行,缺点就是多了依赖