最常用的分布式 ID 解决方案,都在这里了! 您所在的位置:网站首页 分布式id 最常用的分布式 ID 解决方案,都在这里了!

最常用的分布式 ID 解决方案,都在这里了!

2024-06-27 16:13| 来源: 网络整理| 查看: 265

代码语言:javascript复制点击上方 好好学java ,选择 星标 公众号 重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多

作者:小帅学编程

cnblogs.com/sgh1023/p/14094592.html

「一、分布式ID概念」

说起ID,特性就是唯一,在人的世界里,ID就是身份证,是每个人的唯一的身份标识。在复杂的分布式系统中,往往也需要对大量的数据和消息进行唯一标识。举个例子,数据库的ID字段在单体的情况下可以使用自增来作为ID,但是对数据分库分表后一定需要一个唯一的ID来标识一条数据,这个ID就是分布式ID。对于分布式ID而言,也需要具备分布式系统的特点:高并发,高可用,高性能等特点。

「二、分布式ID实现方案」

下表为一些常用方案对比:

描述

优点

缺点

UUID

UUID是通用唯一标识码的缩写,其目的是上分布式系统中的所有元素都有唯一的辨识信息,而不需要通过中央控制器来指定唯一标识。

1. 降低全局节点的压力,使得主键生成速度更快;2. 生成的主键全局唯一;3. 跨服务器合并数据方便

1. UUID占用16个字符,空间占用较多;2. 不是递增有序的数字,数据写入IO随机性很大,且索引效率下降

数据库主键自增

MySQL数据库设置主键且主键自动增长

1. INT和BIGINT类型占用空间较小;2. 主键自动增长,IO写入连续性好;3. 数字类型查询速度优于字符串

1. 并发性能不高,受限于数据库性能;2. 分库分表,需要改造,复杂;3. 自增:数据量泄露

Redis自增

Redis计数器,原子性自增

使用内存,并发性能好

1. 数据丢失;2. 自增:数据量泄露

雪花算法(snowflake)

大名鼎鼎的雪花算法,分布式ID的经典解决方案

1. 不依赖外部组件;2. 性能好

时钟回拨

目前流行的分布式ID解决方案有两种:「号段模式」和「雪花算法」。

「号段模式」依赖于数据库,但是区别于数据库主键自增的模式。假设100为一个号段100,200,300,每取一次可以获得100个ID,性能显著提高。

「雪花算法」是由符号位+时间戳+工作机器id+序列号组成的,如图所示:

符号位为0,0表示正数,ID为正数。

时间戳位不用多说,用来存放时间戳,单位是ms。

工作机器id位用来存放机器的id,通常分为5个区域位+5个服务器标识位。

序号位是自增。

雪花算法能存放多少数据?时间范围:2^41 / (3652460601000) = 69年 工作进程范围:2^10 = 1024 序列号范围:2^12 = 4096,表示1ms可以生成4096个ID。

根据这个算法的逻辑,只需要将这个算法用Java语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式ID,只需保证每个业务应用有自己的工作机器id即可,而不需要单独去搭建一个获取分布式ID的应用。下面是推特版的Snowflake算法:

代码语言:javascript复制public class SnowFlake { /** * 起始的时间戳 */ private final static long START_STMP = 1480166465631L; /** * 每一部分占用的位数 */ private final static long SEQUENCE_BIT = 12; //序列号占用的位数 private final static long MACHINE_BIT = 5; //机器标识占用的位数 private final static long DATACENTER_BIT = 5;//数据中心占用的位数 /** * 每一部分的最大值 */ private final static long MAX_DATACENTER_NUM = -1L ^ (-1L


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有