分布式系统id生成方案分析

分布式「唯一ID生成器」的几种生成方案 前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要的。 设计实现一个对外提供产生唯一id的公共服务,要求: 1)每次请求服务器生成的id不会重复; 2)服务应该是高可用的,既不会因为单台服务器的硬件故障(或其他局部原因)而对外停止服务; ... 阅读详情

一、分布式系统的id 生成

分布式id 需要保证全局唯一,在此基础上 尽可能的保证有序,语义性。

有序性是为了匹配mysql 总innodb引擎的 数据存储结构
语义性是便于查找问题,例如从id 中可以辨识出业务类型,时间等信息。

二、UUID 分析

UUID 是一种过去比较流流行的分布式id 生成方案,使用方式简单,Mybatis-plus 内置了UUID 主键生成器。

UUID 可以保证唯一性,但是没有顺序,更没有语义含义。

在分布式系统中 UUID 虽然可以使用,但是影响了mysql 数据写入性能。

这个已经不推荐使用了。

三、Snowflake

Twitter 早期开源了Snowflake 的相关方案 是目前应用相对比较广泛的一种方式。

MongoDB 的ObjectId

微信的seqsvr

具体实现每种方案有自己的逻辑,但是本质相同

Snowflake 可以保证唯一性,还能保证顺序,另外具备一定的语义性。

3.1Snowflake 的注意点

1 时间变化

Snowflake 依赖于时间计算,所以你需要保证你的分布式集群机器的是时间一直,否则一定概率会出现重复的id.

那么怎么保证所有的机器时间一致呢,这似乎是一个操作系统层次的问题

推荐一篇论文

Lamport 《Time,Clocks,and the Ording of Events in Distributed System》

Twitter 在文档中建议开启NTP

另外一个国内容易忽略的 是冬时令 切换。

冬时令

当时钟拨慢一个小时,也一定程度会出现重复id

2 id 的可预测性

在安全领域,如果黑客能预测或者伪造id 的时候 ,风险便会暴露,例如 生成token的时候,

Erlang 的版本 的flake基于MAC 地址计算,信息也比较敏感。

3时间位数的限制

一些Snowflake 的时间位数有限制,会在有限的时间内耗尽。

时间戳会一直增加,即使一段时间内没有数据进入,该区间的值也不可用了。

不过这一点可以通过自己实现Snowflake 来实现,根据业务实际生产可预测的未来id。

4 Linux 时间漂移

这个问题类似于 时间变化

linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时 钟是要读取RTC时间来进行时间同步(有些情况下,内核时钟也可以通过ntp服务器来读取时间)

这两个时钟通常会有一些误差,所以长时间可以导致 这两个时钟偏离的比较多,最简单的保持两个时间同步的方法是用软件测出他们之间的误差率,然后用软件进行修正。在每次重新启动系统的时候,系统都会用 hwclock命令对时间进行同步。如果内核时钟在每一个时间中断都快或者慢的话,可以用adjtimex命令进行调整,使得RTC和内核时间走的快慢一 致。

四、业务系统的id 检测

简单的理解就是 业务系统拿到id 之后不要着急用,在业务逻辑进行检测一下 是够有重复的id

如果有则丢弃。

这种严谨的逻辑 可以保证id唯一,但是同时增加系统的复杂性,这个大家可以根据自己的业务实际考量。

分布式全局ID生成方案 目录 1、背景 2、特性需求 3、分布式ID的生成方案 3.1 数据库自增ID 3.2 批量生成ID 3.3 UUID 3.4 取当前毫秒数 3.5 Redis生成ID 3.6 snowflake算法(雪花算法) 3.7 美团Leaf算法 1、背景 分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。 在互联网的业务系统中,涉及到各种各样的ID,如在. 阅读详情

相关推荐

Java全局唯一ID生成方案

以上基本列出了所有常用的分布式ID生成方式,其实大致分类的话可以分为两类:一种是类DB型的,根据设置不同起始值和步长来实现趋势递增,需要考虑服务的容错性和可用性。另一种是类snowflake型,这种就是将64位划分为不同的段,每段代表不同的涵义,基本就是时间戳、机器ID和序列数。这种方案就是需要考虑时钟回拨的问题以及做一些 buffer的缓冲设计提高性能。而且可通过将三者(时间戳,机器ID,序列数)划分不同的位数来改变使用寿命和并发数。

白话机器学习 2608

分布式系统全局唯一ID简介、特点、生成

一、什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。 如在金融、电商、支付、等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求,此时一个能够生成全局唯一ID的系统是非常必要的。 二、分布式系统唯一ID的特点 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。 趋势递增:在M...

cowbin2012的专栏 1万+

项目系统唯一ID生成策略方案汇总

我的个人博客 百度搜索:【迷你酷吧】网址:https://www.minikuba.com,迷你酷吧是一个基于程序员经验为基础分享技术文章、算法解题、大厂面试真题、热门项目的平台,致力于为大家提供更多涵盖前后端技术、技能的学习,助力广大热衷编程开发者全面发展。本文链接:https://www.minikuba.com/article/199 分布式系统唯一ID生成方案简介 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常因为使用那种ID策略这个问题而纠结。生成ID的方法有很多,适应不同的

weixin_43381988的博客 1884

9种 分布式ID生成方案,让你一次学个够

一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?1、什么是分布式ID?拿MySQL数据库举个栗子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系

m0_63437643的博客 1089

从安装到出图:一份给振动测试新手的LMS Test.Lab 2021完整避坑手册(含许可证更新和常见弹窗解决)

本文为振动测试新手提供LMS Test.Lab 2021的完整使用指南,涵盖安装配置、许可证更新、数据采集到频域后处理的全流程。特别针对常见弹窗错误提供解决方案,并详细讲解Colormap时频图分析技巧,帮助用户快速掌握振动数据分析核心技能。

weixin_29268331的博客 980

单片机开发者的福音:3步搞定VSCode智能补全(IAR工程+Clangd实战)

本文为单片机开发者提供了一套高效解决方案,通过EIDE插件将IAR工程导入VSCode,并生成关键的compile_commands.json文件,结合Clangd配置,仅需三步即可实现精准的智能代码补全、一键跳转等现代编辑功能,大幅提升嵌入式开发效率。

coffee的博客 523

分布式ID生成方案:9种方式,总有一款适合你的应用

LOADING_PERCENT的值就是20),即设定loadingId为20%的阈值,例如当前id是10000,步长为10000,那么loadingId=12000。Leaf的snowflake模式依赖于ZooKeeper,不同于原始snowflake算法也主要是在workId的生成上,Leaf中workId是基于ZooKeeper的顺序Id来生成的,每个应用在使用Leaf-snowflake时,启动时都会都在Zookeeper中生成一个顺序Id,相当于一台机器对应一个顺序节点,也就是一个workId。

Reische的博客 1986

论文浅读之PIP-Net: Patch-Based Intuitive Prototypes for Interpretable Image Classification

这篇文章的主要贡献包括:1 提出了一种新型的可解释图像分类模型PIP-Net,它基于原型部分学习可解释的原型,实现内置解释性。2 PIP-Net采用自监督学习的新正则化方法,学习原型之间的相似性,使得 latent 空间中的相似性能更好地与人类视觉感知相一致,从而减小了所谓的语义差距。3 PIP-Net可解释为一个稀疏的打分表,它可以检测图像是否属于任何类,或是否属于多个类。它也可以对OOD数据进行分类并说“我没有看到过这个”。

qq_49370210的博客 1791

面试必备:10种分布式ID的生成方案

日常工作中,我们开发的系统、或者中间件,都是分布式部署的。比如你的订单数据库,做了分库分表,这时候,你需要一个唯一的ID来标记一条数据。这时候,就需要分布式ID。分布式ID是在分布式系统下使用的ID,用于在多个节点中生成全局唯一的标识符。

Wewe的博客 2863

芯片硅前验证技术与驱动工程师实战指南

硅前验证是芯片开发流程中的关键环节,通过pre-silicon simulation等技术手段在流片前验证设计正确性。其核心技术包括软件仿真、FPGA原型验证和硬件仿真器解决方案,涉及Linux驱动开发、芯片架构理解和波形分析等核心技能。作为连接芯片设计与系统集成的桥梁,硅前验证能早期发现设计缺陷,节省数百万美元流片成本。以Cadence Palladium为代表的硬件仿真器,通过专用服务器系统实现比纯软件方案快100-1000倍的仿真速度,为驱动工程师提供完整的外设模型验证环境。掌握硅前验证技术可显著提升

weixin_42522857的博客 321

ArduPilot简介

一,什么是ArduPilot? ArduPilot是一个可信的,多用途的,开源的自动驾驶系统。该系统支持了非常多的交通工具类型,包括多旋翼无人机,传统直升机,固定翼飞行器,船,潜艇,巡逻车等。源码由大型开发者社区的专家和爱好者共同开发和维护。也欢迎更多的开发者加入源码的迭代演进,最好的“打开”方式就是加入开发者团队论坛。该论坛对所有人开放,在这里可以深入感受到开发者们对ArduPilot的热爱。 论坛链接:ArduPilot Discourse 开发者指南:Welcome to the ArduPil

从0到1,突破自己 5450

分布式ID生成方案

分布式ID生成方案 雪花算法

杨宇昌的博客 2152

MicroCap声学仿真介绍(三)-人耳的频率响应

这里需要注意的是,24mm我们会填为”24m”,这里的“m”是毫的意思,24m意思是24e-3,同理7.4mm我们可以填为7.4m,意思是7.4e-3。MicroCap声学库中,已内置“声源”模块和“管”模块,我们需要调用这两个模块,并用连接线将这两个模块连接到一起,完成仿真工作。上图中第一个图是在管的一端输入1Pa(94dBSPL)的信号,管的另一端的不同频率的声压大小的仿真结果。上述的结果跟我们的常识也是符合的。换言之,我们要仿真的目的是在管的一端加1pa的声压时,管的另一端不同频率下的声压分布。

山无忧的博客 1471

分布式系统中全局唯一ID的生成方案及对比分析

在分布式架构中,当我们将数据分库分表后,传统的自增主键机制面临着唯一性挑战。本文深入剖析了分布式系统中全局唯一ID生成的四种主流方案:UUID、单表自增、多表步长和雪花算法,从性能、存储空间、有序性和可用性等维度进行全面对比。你是否好奇为何Twitter选择了雪花算法?或者如何解决雪花算法中的时钟回拨问题?文章不仅提供了各方案的实现原理和代码示例,还分享了微博、美团等大厂的实践经验,帮助你在实际项目中做出最合适的技术选择。无论是小型应用还是高并发大型分布式系统,这里都有你需要的ID生成最佳实践。

猫步轻移,以学求知。余于此方寸之地,如猫观鼠,细察技艺所得,思维所悟。灵思如猫之警觉,日积月累,终成智海; 1365

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

共轭梯度法的核心原理是求解优化问题的共轭向量组作为优化方向,由于优化方向间彼此正交,故每次迭代只需沿着一个方向寻优而互不影响。本文设计基于ESDF的障碍约束、曲率约束和平滑约束,基于ROS C++和Python提供了共轭梯度法的轨迹优化实践案例

FRIGIDWINTER的博客 1万+

echarts 饼图(加载进度条动画效果)

1、外侧动画细线效果运动“custom”自定义系列中“renderItem”属性来实现,动态修改起始角度和终止角度。2、圆环使用" pie "类型添加两个data值来画百分比圆环,动态修改data中的值。

God's asylum的博客 1630

深入探讨分布式 ID 生成方案

在分布式系统蓬勃发展的当下,生成全局唯一的ID至关重要。今天就来深入探讨几种主流的分布式ID生成方案,包括大名鼎鼎的UUID和雪花算法,剖析它们的优劣与适用场景。

m0_57836225的博客 956

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

常用的分布式ID设计方案

UUID是一种标准的128位长的ID格式,它可以通过软件算法自动生成。然而,UUID的长度较长,存储和索引效率较低,而且它的随机性可能导致排序上的不便。在分布式系统中,生成全局唯一的ID是一个常见的需求。无论是数据库表中的主键,还是消息队列的消息ID,都需要一个高效且可靠的唯一标识符。Snowflake是由Twitter开源的一种分布式ID生成算法,它可以每秒产生约400万个ID。该算法产生的ID是一个64位的整数,其中包含时间戳、数据中心ID、机器ID以及序列号等信息。随机生成的ID不利于排序。

2301_78714573的博客 570

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

分布式系统唯一ID生成方案汇总

我的公众号「码农之屋」(id: Spider1818),分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。 文章目录 1. 数据库自增长序列或字段 2. UUID 3. UUID的变种 ...

lsz137105的专栏 292

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

分布式系统中主键生成策略

主键生成策略 1分布式系统中主键生成的问题 案例,在集群的写库中,生成的主键重复的问题。比如说,A库用户表插入一条数据,生成主键id=1,B库用户表插入的数据,生成的主键id也为1,那么应该怎么办让A,B库生成的主键id不重复,且有序呢。 策略 1Snowflake(雪花算法,现在非常流行) id全局唯一 高性能,低延迟 独立的应用 按时间有序 需要独立的开发和部署 1.1结构 41位...

zhou920786312的博客 1894

全局唯一ID生成方案详解

性能要求可用性要求ID长度限制是否需要递增是否需要包含业务含义是否需要分库分表没有最好的方案,只有最适合的方案。应该根据具体业务场景和需求来选择合适的ID生成方案。

CoLiuRs 1587

分布式系统唯一ID的生成方案讨论

在分布式系统下唯一id问题,就是id咋生成?比如分表分库,因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那是不对的。举个例子,一个表拆分为了2张表,每个表的id都从1开始累加,这个肯定有问题了!你的系统就没办法根据表主键来查询了,比如id = 10这个记录,在两个表里都有!所以此时就需要分布式架构下的全局唯一id生成的方案了,保证每个表内的某个id,全局唯一。全局唯一id主要有...

weixin_30730053的博客 132

java生成8位的uuid_分布式系统全局唯一ID简介、特点、生成

一、什么是分布式系统唯一ID在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在金融、电商、支付、等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求,此时一个能够生成全局唯一ID的系统是非常必要的。二、分布式系统唯一ID的特点全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。趋势递增:在MySQL I...

weixin_39647499的博客 1852

分布式ID生成方案--雪花算法和UUID对比

分布式ID的业务需求 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。 比如美团外卖:由于系统中数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据,如订单、骑手、优惠券也都需要有唯一ID做标识。因此一个能够生成全局唯一ID的系统是非常必要的。 生成ID的硬性要求 全局唯一 不能出现重复的ID号,既然是唯一标识,这是最基本的要求。 趋势递增 在MySQL的InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用BTree的数据结构来存储索引数据。因此在主键的选择上我们应该尽量使用有

qq_40950903的博客 2万+

分布式ID详解(5种分布式ID生成方案)

分布式架构会涉及到分布式全局唯一ID的生成,今天我就来详解分布式全局唯一ID,以及分布式全局唯一ID的实现方案@mikechen

mikechen的互联网架构 1万+
上一篇: Redis lua脚本 采坑实践
下一篇: Mybatis-plus 自定义SqlSessionFactory
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值