其他分享
首页 > 其他分享> > 分布式ID

分布式ID

作者:互联网

一. 概述

传统方案在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在点评的金融,支付,餐饮,酒店,猫眼电影等产品。对数据分库分表后需要一个唯一ID来标识一条数据或消息

思维导图
在这里插入图片描述


二. 开源组件

百度(uid-generator)

滴滴(Tinyid)

美团(Leaf)

三. 特点

四. 方案

1. 时间戳

时间戳不能用来解决分布式ID的原因:
有可能在同一毫秒的时候,会有多个请求打进来,那么就可能在该毫秒生成两条数据,并且ID是一致的

2. UUID

可以考虑使用它来作为分布式ID
缺点:

3. 数据库主键自增

缺点:

4. Redis自增

缺点

5. 雪花算法

五. 总结

主键自增与号段模式区别

场景:将一个应用部署到一台服务器,

雪花算法

一般组成:1bit符号位+41bit时间戳位+10bit工作进程位+12bit序列号位

六. SpringBoot整合Leaf

步骤

 <dependency>
            <artifactId>leaf-boot-starter</artifactId>
            <groupId>com.sankuai.inf.leaf</groupId>
            <version>1.0.1-RELEASE</version>
</dependency>
leaf.name=com.sankuai.leaf.opensource.test
leaf.segment.enable=true
leaf.segment.url=xxxxxx
leaf.segment.username=xxxx
leaf.segment.password=xxxxx


leaf.snowflake.enable=true
leaf.snowflake.address=xxxxx
leaf.snowflake.port=2181
@RestController
public class IdController {
    @Autowired
    private SegmentService segmentService;

    @Autowired
    private SnowflakeService snowflakeService;
// 号段模式
    @GetMapping("/segment")
    public Result segment() {
        return segmentService.getId("leaf-segment-test");
    }
// 雪花模式
    @GetMapping("/snowflake")
    public Result snowflake() {
        return snowflakeService.getId("ray");
    }
}

问题

若两个程序运行在同一服务器:可能会产生相同的ID

原因:1bit符号位+41时间戳位+10bit工作进程位+12bit序列号位
由于是同一台服务器,如果在同一时间2个请求分别打在了两太服务器上,由于可能会出现10bit工作进程位相同,12bit序列号位相同,因此可能产生相同的Id

解决方案:如果确实想部署在同一台服务器上,可考虑将程序运行在docker里,同一集群docker容器IP唯一

标签:leaf,数据库,号段,服务器,segment,ID,分布式
来源: https://blog.csdn.net/zhangliewena/article/details/118633759