首页 > 其他分享 >京东一面:分布式 ID 生成方案怎么选?写得太好了!

京东一面:分布式 ID 生成方案怎么选?写得太好了!

时间:2023-09-15 09:11:49浏览次数:36  
标签:有序 auto 生成 毫秒 increment 京东 ID 分布式

背景

在分布式系统中,经常需要用到全局唯一ID发生器,标识需要存储的数据。我们需要什么样的ID生成器?

ID生成器除了是数据的唯一标识以外,一般需要在系统中承担更多的责任,概括起来有以下几点:

唯一性:“全局唯一” vs “业务唯一”?

分布式系统使用唯一的ID生成器,会有非常严重的申请互斥问题。互斥加锁意味着成本和性能的下降,不容易去实现一个高性能高可靠的架构。在业务系统中,往往也不需要全局唯一的ID。

比如在通讯系统里,聊天消息不需要全局唯一,标识一条用户发出的消息的ID,只要保证用户唯一性即可。因为消息本身归属于某一用户,因此用户唯一已经隐含了“全局唯一ID ( = 用户ID + 消息ID )”。

时间相关:“秒级” vs “毫秒”?

时间是天然唯一的,因此也是很多设计的选择。但对于一个8Byte的 ID 而言,时间并没有那么多。你如果精确到秒级别,三十年都要使用30bit,到毫秒级则要再增加10bit,你也只剩下20bit 可以做其他事情了。每秒一个或者每毫秒一个ID明显是不够的,刚才说到还有20bit 可以做其他事情,就包括一个SequenceID。

那时间用秒还是毫秒呢?其实不用毫秒的时候就可以把空出来的10bit 送给 Sequence,但整个ID 的精度就下降了。峰值速度是更现实的考虑。Sequence 的空间决定了峰值的速度,而峰值也就意味着持续的时间不会太久。这方面,每秒100万比每毫秒1000限制更小。

有序:“粗略有序” vs “精确有序”?

首先,如果要达到精确的有序,就要对 Sequence 进行并发控制,性能上肯定会打折。其次,同一时间只能生成一个ID,意味着同一时间只有一个ID生成服务实例可以提供服务,精确有序还会面临容灾问题。

另外一个选择就是,在这个秒的级别上不再保证顺序,而整个 ID 则只保证时间上的有序。后一秒的 ID肯定比前一秒的大,但同一秒内可能后取的ID比前面的号小。粗略有序在使用时非常关键,业务上可接受才能成为候选方案。

设计细节

看下业界如何设计ID发生器

SnowFlake

41bit留给毫秒时间,10bit给机器 (MachineID) ,剩下12bit留给Sequence。

Weibo

微博 30bit的秒级时间,4bit来区分IDC,2bit 区分业务,15bit 给 Sequence。理论上限3.2w/s的速度。由于当前发号服务是机房中心式的,1bit 来区分热备。最终,没有用满64bit。

Flicker

Flicker 在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。
在我们的应用端需要做下面这两个操作,在一个事务会话里提交:

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();

Flicker启用了两台数据库服务器生成ID来容灾,通过区分auto_increment的起始值和步长来生成奇偶数的ID。

TicketServer1:
auto-increment-increment = 2
auto-increment-offset = 1

TicketServer2:
auto-increment-increment = 2
auto-increment-offset = 2

微信

微信使用MySQL持久化未分配的最大ID,每次从DB取一段放到内存分配给调用方。微信的ID生成是严格递增的,意味着同一时间只能有一台机器提供服务,因此使用仲裁服务+租约机制+路由表,进行容灾。

Shopee Feeds 如何生成ID ?

考虑到Feeds业务的特性,并不需要精确有序,因此我们使用snowflake算法进行ID生成。使用39 (毫秒)+ 5(机器) + 9(seq),来保证ID作为Redis的score不会溢出。

Redis 有序集合的分数使用双精度64位浮点数, 表示为一个IEEE 754 floating point number,它能包括的整数范围是-(2^53) 到 +(2^53)

这样的ID生成器可以使用大约17年,对于一款产品的生命周期来说已经足够使用。

针对时间回拨产生的问题,因为发生的频率极小,所以只需要简单判断,如果不满足 currentMillis <= lastTime,则返回错误即可。

作者:cyningsun
来源:www.cyningsun.com/12-26-2018/id-generator.html

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

标签:有序,auto,生成,毫秒,increment,京东,ID,分布式
From: https://www.cnblogs.com/javastack/p/17704049.html

相关文章

  • 对于数组中取下标中值操作int mid=(left+right)/2的讨论
    分两种情况1.left和right之间(含left和right元素)共有奇数个,此时中轴线穿过正中间的元素判断方法:right-left的值为偶数,即(right-left)%2=0。此时(left+right)/2恰为整数,此结果恰为left与right下标之间的中值下标,正好在中轴线上2.left......
  • PivotGridControl自定义行数据的统计公式
    我们在使用PivotGridControl进行数据统计的时候,用时候需要在不同的行使用不同的汇总公式的情况,本文就是为了说明怎么实现此功能,如下图说明 数据源: 注意:此时数据列指定的SummaryType设置的是Sum;并且数据列指定了为double类型  SummaryType指定的几种聚合函数,Max、Min、......
  • idea导入快捷键
    转载:https://www.cnblogs.com/poscana/p/14916698.html 习惯了eclipse的同学可能对IDEA的快捷键不习惯,这里打包了一份eclipse中快捷键的设置。直接导入IDEA就可以使用。 使用方法:step1:下载快捷键jar包,下载地址在文章末尾step2:在IDEA中以importsetting的方式导入jar包......
  • idea使用设置grade构建项目遇到的坑
    坑1:构建提示无法通过配置文件构建 解决办法:经过查明是系统自动更新将gradle的配置默认为gradle,现在改为idea。问题解决 坑二:设置程序参数,给配置avtive设置初始值  ......
  • HBASE完全分布式安装
    介绍HBase–HadoopDatabase,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。HadoopHDFS为HBase提供了高可靠性的底层存储支持,HadoopMapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。下载HBasehttps://hbase.apache.org/down......
  • IDEA 22.2.3 创建web项目及Tomcat部署与服务器初始界面修改(保姆版)
    开始前请确认自己的Tomcat、JDK已经安装配置完毕不同版本的IDEA创建配置流程可能不同,演示中的IDEA版本号为22.2.3本教程创作时间为2023/09/141.创建项目通过下图路径进入创建界面,项目名称、路径、JDK都选择完毕后点击Create创建2.创建web目录右键单击目录名呼出二级菜单......
  • Mongo Template 禁用 _id 字段自动转 ObjectId
    目前情况下,只能在实体中不使用@Id而使用 @Field("_id"),让自动转换那边的isIdField判断为false方式~~~@Field("_id")privateStringid;~~~使用@Id注解;或者使用MongoTemplate指定集合名称的系列方法,都会走自动转ObjectId......
  • Flutter插件flutter_boost 在android模块中的报红问题解决.
    1,在开发Flutter插件时,打开插件的android项目,准备编写native端的代码时,发现各种报红,代码无法跳转,体验十分不好。就像我下面的截图一样:导入了FlutterBoostflutterBoost源码爆红。但是运行正常。。这说明本身是没有问题的。。分明是没有错误的类都存在。但是就是爆红。。。。可......
  • Android 9 WiFi连接过程
    我们从setting 入口开始分析该过程;1.setting界面 packages\apps\Settings\src\com\android\settings\wifi\WifiSettings.java 创建Dialog2@OverridepublicDialogonCreateDialog(intdialogId){switch(dialogId){caseWIFI_DIALOG_ID:......
  • SOLIDWORKS有限元分析怎么做?
    在许多专业领域中,尤其是在机械行业,为了缩短开发周期,设计完成后通常需要进行仿真分析。通常情况下,大家会使用专业的有限元仿真软件如ANSYS进行仿真分析。但其实,SOLIDWORKS软件因其简单易用的制图功能以及内置的专用有限元仿真模块Simulation,更适合初学者使用。接下来,微辰三维将简要......