分布式ID选型对比(1)

常见的几种ID生成方式对比:

种类

全局唯一

高性能

高可用

趋势递增

中心服务

缺点

UUID

高(本地生成,(无网络开销)

低(无序,不适用)

无序、字符串

数据库自增

单表唯一

中(宕机就会使业务服务中断)

安全性差,能猜出来规律

对于分库分表场景无法唯一

数据库自增-集群

中(宕机就会使业务服务中断)

通过设置初始值及步长进行自增

不好扩展,增加节点可能导致不唯一

数据库号段模式

低(需要频繁更新表maxId)

中(宕机就会使业务服务中断)

依赖数据库,需要频繁更新数据库maxId

乐观锁方式保证高可用

数据库号段模式+缓存

在号段模式基础上增加缓存buffer

缓存数据同步到数据库需要保证强一致性,增加了复杂度

redis的incr

单模块唯一

多模块不适用

中(宕机就会使业务服务中断)

多服务情况下单台redis无法满足

多redis集群时,主master宕机,会在较短时间内存在ID重复

雪花算法

高(不考虑回拨情况下)

高(本地生成,(无网络开销)

中(趋势递增)

存在时钟回拨问题

多节点时可能需要自定义datacenterId和machineId的生成(IP)

百度uid generator

高(本地生成,(无网络开销)

高(趋势递增)

在雪花算法基础上增加启动服务时获取workId(或初始化workId)

项目启动时间会被拉长,依赖数据库

美团Leaf

高(本地生成,(无网络开销,需要自己实现)

中(中心服务)

高(自定义方式较复杂)

百度uid模式下衍生而来

可以实现自己的ID生成中心,即leaf-server,由该项目提供获取ID的方法供调用,但该方式比较耗IO,性能会有所下降

依赖数据库或zookeper

为了提升性能,需要自己在项目里面自定义实现Leaf server

滴滴TynyId

高(本地生成,(无网络开销,需要自己实现)

中(中心服务)

高(自定义方式较复杂)

美团Leaf模式下衍生而来

可以实现自己的ID生成中心,即TynyId-server,由该项目提供获取ID的方法供调用,但该方式比较耗IO,性能会有所下降

依赖数据库或zookeper

为了提升性能,需要自己在项目里面自定义实现TynyId server

----------------------------------------------------------------------------------------------

数据库自增

一, 引入依赖:


    mysql
    mysql-connector-java
    8.0.19


    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    2.2.2

二, 新建表

CREATE TABLE `auto_generate` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

三, resources目录下编写自动生成代码配置文件: generatorConfig.xml





    
    

    
        
            
            
        

        
        
        

        
        
            
        

        
        
            
                    

你可能感兴趣的:(框架部分,特定功能,springboot,分布式,分布式ID,分布式ID实战)