分布式全局唯一id实现总结

news2024/11/22 15:54:49

前言:本文意在对借助db和程序生成分布式id进行一些总结,以及对其特性进行比较分析;

1 实现方式:

  • Db 通过配置步长和初始值的方式,使得每个db库生成id 的不同性,如 3个db 实例情况下:其步长均设置为3 ,db1 的初始值为1 ,db2 的初始为2,db3的初始值为3,则db1 生成的id为:1,4,7…;db2 生成的id为:2,5,8… ;db3 生成的id为:3,6,9… ;
  • 百度的分布式id 则为改进版的雪花id生成,通过每次项目启动时都插入一条id 为自增的int 值,插入成功后以主键id 作为生成雪花id 的workId,利用id 的自增性,保证workId 的唯一性;
  • 滴滴的分段id,通过先获取一段id 的方式,在真正需要生成id 时,则每次+1 生成id,如果+1后超过了本段id 的最大值,则取下一段id,来继续生成id;
  • leaf 的分段id 和滴滴的分段id 生成方式基本相同;leaf雪花算法id 则通过向zookeeper 注册持久有序节点的方式来获取本次生成id所需要的workId,因为注册的是持久有序节点,则保证了新服务workId 的唯一性,对于已有的服务,则通过ip+port 的方式来获取之前已经注册的workId;

2 优缺点:

2.1 db 步长方式生成id:

# 设置步长为100
auto-increment-increment=100
# 设置自增初始值 6
auto-increment-offset=6

优点:

  • id 生成的服务均由db 服务器控制,程序可以不关心id 的生成,开发效率高效;
  • id 生成和数据插入性能又有db自身决定,方式简单;

缺点:

  • 对于有些db 步长和初始值的设置,要想重启db服务后依然生效,需要按照db服务实例级别完成设置,而且设置完成对此db实例的所有数据库都生效,影响范围较广;
  • 多个db 服务实例,需要占用较多的服务资源,维护成本也相应提高;
  • mybatis 每次插入失败,虽然没有插入成功,但是本次的id不会被下一次使用,会造成id 的一定浪费;

2.2 百度的分布式id:
在这里插入图片描述
优点:

  • id 由程序本身控制,id 生成是可控的;
  • 对外提供起始时间戳,workId可以 覆盖设置,比较灵活;

缺点:

  • id由程序生成,需要保证程序的高可用,有一定的维护成本;
  • workId 通过自增的主键确定,每次服务重启都会得到一个新的workId,老的workId会被舍弃,造成workId 的一定浪费,并且最多支持2^workId 位 次数的重启,超过改次数 workId又会从0 开始;

2.3 滴滴的分段id:

CREATE TABLE `tiny_id_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `biz_type` varchar(63) NOT NULL DEFAULT '' COMMENT '业务类型,唯一',
  `begin_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '开始id,仅记录初始值,无其他含义。初始化时begin_id和max_id应相同',
  `max_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '当前最大id',
  `step` int(11) DEFAULT '0' COMMENT '步长',
  `delta` int(11) NOT NULL DEFAULT '1' COMMENT '每次id增量',
  `remainder` int(11) NOT NULL DEFAULT '0' COMMENT '余数',
  `create_time` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '更新时间',
  `version` bigint(20) NOT NULL DEFAULT '0' COMMENT '版本号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_biz_type` (`biz_type`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='id信息表';

优点:

  • id 由程序本身控制,id 生成是可控的;
  • 提供了客户端方式获取id,获取较为方便,并且id可以根据业务进行隔离;
  • 提高双段id 可以容忍id生成服务的短时不可用;

缺点:

  • 每次获取到的分段id 会被存入到系统的内存中,一旦服务重启,重新获取新的分段id,老的的分段id即时没有被使用也会丢弃,会造成id 的一定浪费;
  • id 的生成是顺序递增的,如果业务中用于订单的id ,可能会被使用当前id-昨天id ,从而取的订单量;

2.3 美团的leaf :

CREATE TABLE `leaf_alloc` (
  `biz_tag` varchar(128) NOT NULL DEFAULT '',
  `max_id` bigint(20) NOT NULL DEFAULT '1',
  `step` int(11) NOT NULL,
  `description` varchar(256) DEFAULT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

优点:

  • id 由程序本身控制,id 生成是可控的;
  • 分段id提高双段id 可以容忍id生成服务的短时不可用,并且可以安装业务进行隔离;
  • 整合了分段id 和雪花算法id;
  • 雪花算法中workId 通过向zookeeper注册持久有序的节点,来获取workId,避免了每次重启都要获取新的workId,避免了workId 的浪费;

缺点:

  • 目前对外只提供了http 获取id 的方式,需要考虑网络的可靠性;
    分段id:
  • 每次获取到的分段id 会被存入到系统的内存中,一旦服务重启,重新获取新的分段id,老的的分段id即时没有被使用也会丢弃,会造成id 的一定浪费;
  • id 的生成是顺序递增的,如果业务中用于订单的id ,可能会被使用当前id-昨天id ,从而取的订单量;
    雪花算法:
  • 使用了zookeeper进行节点的注册,所以需要保证zookeeper的服务可用性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我3年前写的博客,又被别人抄去发论文了,该论文整个正文部分几乎直接照抄我的博客

我想说每一篇原创博客都是作者的心血,有时候写一篇博客也许会花一天,甚至好几天的时间,尊重原创,营造好的环境,才有可能出现更多优质的博文,而不是到处都是抄来抄去的低质量水文。 前几天接到来自粉丝的私信…

加密解密软件VMProtect教程(八)许可制度之集成到应用程序

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

全网最快PCB打样| 急速小批量打样的秘密在这里

对于广大爱好者以及电子工程师来说,电子行业的快速发展,导致电子产品的多样化和个性化,电路设计的复杂度和难度提高,需要更多的PCB打样来验证和测试,满足细分市场的客户需求。 随着PCB打样厂家的服务优化和价格降低&am…

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方软件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击。 服务器需要收集的信息包含三个方面: 操作系统信息等识别waf(Web应用程…

高级测试必备技能:从session请求到token请求,傻瓜式掌握Charles和postman断言技巧

引言 在快速发展的数字化时代,软件测试作为保障软件品质和用户体验的重要一环,显得愈加重要。SESSION请求、TOKEN请求、charles使用和Postman断言等技术,成为测试人员不可或缺的必备技能。 在这篇文章中,我将深入浅出地为您讲解…

Java编程思想(第4版) 扫描版

Java编程思想 - 基础必备 Java基础必备书籍! 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C以及Java语言都有独到、深入的见解,以通俗易懂及小而直接的示例解…

使用C++快速上手ProtoBuf (一)

文章目录 课程目标一、初始ProtoBuf1. 序列化概念2.ProtoBuf是什么3.ProtoBuf的使⽤特点 二、安装ProtoBuf三、教学思路四、快速上⼿步骤1:创建.proto文件步骤2:编译contacts.proto⽂件,⽣成C⽂件步骤3:序列化与反序列化的使⽤⼩结…

2分钟快速上手工作流的创建与运行

前段时间,偶然发现一款低代码产品,工作流很突出,至少我觉得,设计颇有精妙之处。 可视化工作流是实现看板的第一步,要想业务人员也能了然其中的运行逻辑,这款产品可是做到了白痴也看得懂的程度!…

讲个小故事

5月21日,沈梦辰在微博晒出了一组照片,记录下520这天杜海涛去机场接机的甜蜜瞬间。杜海涛不仅给沈梦辰送上兔子造型的红玫瑰花束,同时还准备了现切的新鲜西瓜。同一天,李湘女儿王诗龄也在网络晒出了自己的520礼物,那是一…

DOS命令(了解)

目录 一、 DOS 介绍 二、相关的知识补充: 相对路径, 绝对路径 ​三、常用的 dos 命令 1) 查看当前目录是有什么内容 dir 2) 切换到其他盘下:盘符号 cd : change directory 3) 切换到当前盘的其他目录下 (使用相对路径和绝对路径演示), ..\表示上一级…

网关Netfilx Zuul:---(Eureka高可用操作)

之前我们创建完成了3个Eureka的客户端的服务操作,你会发现我们还是没有能够通过微服来进行对他访问,还是必须通过自己服务的端口号来进行访问,那么我们的微服务是没有能够完成的,这个时候我们就需要通过网关进行操作 其实网关就是…

618大促聚焦“低价”与“规则简化”

618年中大促即将拉开帷幕。 多个电商平台已经公布今年618促销节的节奏与玩法,618开启之前,电商平台也纷纷表达了对于年中大促的重视,淘宝天猫618总负责人暮珊此前表示,“今年淘宝天猫618是历史上最大投入的一届”。抖音副总裁木青…

设计模式之【策略模式】,去掉繁琐的if-else,实现算法的动态替换

文章目录 一、什么是策略模式1、策略模式应用场景2、状态模式与策略模式的区别3、策略模式优缺点4、策略模式的三大角色 二、实例1、策略模式的一般写法2、促销活动案例3、网购订单支付案例4、DispatcherServlet的优化5、文件排序案例 三、源码中的策略模式1、Comparator接口2、…

在字节做了5年的软件测试,被辞了,太真实了...

先简单说下,涵哥是某不知名 985 的本硕,17 年毕业加入字节,以“人员优化”的名义无情被裁员,之后跳槽到了有赞,一直从事软件测试的工作。还差一个月也6年了吧,算是在这行的资深划水员。6年的时间也让涵哥从…

ChatGPT 辅助生成PPT

前言 介绍 ChatGPT 与 MindShow 结合高效生成 PPT。 文章目录 前言一、准备工具二、使用步骤1. 内容生成2. 制作 PPT三、小节一、准备工具 ChatGPT:MindShow:MindShow网站 MindShow 内置了丰富的模板、图表和设计元素。具有自动排版功能,可根据输入内容智能调整布局。二、使…

29岁测试被辞,面试2个月还找不到工作....

最近一个29岁老同学联系我,因为被公司辞退,找我倾诉,于是写下此文。 他是14年二本毕业,在我的印象里人特别懒,不爱学习,专业不好,毕业前因为都没找到合适工作,直接去创业了&#xf…

导入报错:Limits: MIN_INFLATE_RATIO: 0.010000, Entry: xl/drawings/drawing1.xml

今天突然遇到一个现场提出的问题:说导入文件导入不成功,咋突然有这个问题 2023-05-23 14:19:11,174 ERROR [http-nio-9104-exec-5] o.a.c.c.C.[.[.[.[dispatcherServlet] [DirectJDKLog.java : 175] Servlet.service() for servlet [dispatcherServlet]…

VMwareESXI虚拟机黑群晖7.2 正式版 (懒人包)

版本说明: VMware Workstation 桌面版虚拟机,可下载VMware专用版本 VMware ESXi虚拟机,可以下载OVA版本 VMware Workstation桌面版虚拟机 使用教程: 1.下载VMware专用版本,然后进行解压,双击解压出来的&q…

前端Vue:权限管理,给角色分配权限

👉前端-Vue权限控制,菜单权限,按钮权限_一人创客的博客-CSDN博客 目录 介绍: 前端权限的概念: 前端权限的意义: Vue权限管理的代码实现: 菜单 刷新界⾯菜单消失 标识⽤户名, ⽅便查看当前…

chatgpt赋能Python-python_kali

Python与Kali Linux:SEO攻击的更有效方法 介绍 Python是一种强大且高度灵活的编程语言,也是许多安全专家、黑客和网络攻击者所喜欢的工具之一。Kali Linux是一个专注于安全审计、渗透测试和网络安全的Linux发行版,其中包含了许多流行的安全…