• 分布式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

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

    数据库自增

    一, 引入依赖:

    1. mysql
    2. mysql-connector-java
    3. 8.0.19
    4. org.mybatis.spring.boot
    5. mybatis-spring-boot-starter
    6. 2.2.2

    二, 新建表

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

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

    1. "1.0" encoding="UTF-8"?>
    2. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    4. "/Users/lizhihao/.m2/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar"/>
    5. "testTables" targetRuntime="MyBatis3">
    6. "suppressAllComments" value="true"/>
    7. "com.mysql.cj.jdbc.Driver"
    8. connectionURL="jdbc:mysql://localhost:3306/generate_id" userId="root"
    9. password="root">
    10. "forceBigDecimals" value="false"/>
    11. "org.com.spi.model" targetProject="src/main/java">