Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?

news2025/8/16 18:29:24

image.png

典型回答

首先,我们需要明确通常的分布式 ID 定义,基本的要求包括:

  • 全局唯一,区别于单点系统的唯一,全局是要求分布式系统内唯一。

  • 有序性,通常都需要保证生成的 ID 是有序递增的。例如,在数据库存储等场景中,有序 ID 便于确定数据位置,往往更加高效。

目前业界的方案很多,典型方案包括:

  • 基于数据库自增序列的实现。这种方式优缺点都非常明显,好处是简单易用,但是在扩展性和可靠性等方面存在局限性。

  • 基于 Twitter 早期开源的Snowflake的实现,以及相关改动方案。这是目前应用相对比较广泛的一种方式,其结构定义你可以参考下面的示意图。

image.png

整体长度通常是 64 (1 + 41 + 10+ 12 = 64)位,适合使用 Java 语言中的 long 类型来存储。

头部是 1 位的正负标识位。

紧跟着的高位部分包含 41 位时间戳,通常使用 System.currentTimeMillis()。

后面是 10 位的 WorkerID,标准定义是 5 位数据中心 + 5 位机器 ID,组成了机器编号,以区分不同的集群节点。

最后的 12 位就是单位毫秒内可生成的序列号数目的理论极限。

Snowflake 的官方版本是基于 Scala 语言,Java 等其他语言的参考实现有很多,是一种非常简单实用的方式,具体位数的定义是可以根据分布式系统的真实场景进行修改的,并不一定要严格按照示意图中的设计。

  • Redis、ZooKeeper、MongoDB 等中间件,也都有各种唯一 ID 解决方案。其中一些设计也可以算作是 Snowflake 方案的变种。例如,MongoDB 的ObjectId提供了一个 12 byte(96 位)的 ID 定义,其中 32 位用于记录以秒为单位的时间,机器 ID 则为 24 位,16 位用作进程 ID,24 位随机起始的计数序列。

  • 国内的一些大厂开源了其自身的部分分布式 ID 实现,InfoQ 就曾经介绍过微信的seqsvr,它采取了相对复杂的两层架构,并根据社交应用的数据特点进行了针对性设计,具体请参考相关代码实现。另外,百度、美团等也都有开源或者分享了不同的分布式 ID 实现,都可以进行参考。

关于第二个问题,Snowflake 是否受冬令时切换影响?

我认为没有影响,你可以从 Snowflake 的具体算法实现寻找答案。我们知道 Snowflake 算法的 Java 实现,大都是依赖于 System.currentTimeMillis(),这个数值代表什么呢?从 Javadoc 可以看出,它是返回当前时间和 1970 年 1 月 1 号 UTC 时间相差的毫秒数,这个数值与夏 / 冬令时并没有关系,所以并不受其影响。

你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。

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

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

相关文章

小体积单输入单输出单电源供电光电隔离转换器0-75mV/0-5V/0-200mV/0-20mA/4-20mA

概述: 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

Unity | 以附加模式加载场景,实现多场景叠加及注意事项

1 多场景叠加 Unity 允许多场景叠加,这种叠加包括编辑模式及运行模式 新建两个简单的场景,SampleScene 和 AdditiveScene,设置不同的天空盒及平行光源颜色 SampleScene AdditiveScene 2 编辑模式 2.1 添加场景 在编辑器中的场景资源右键选…

vue draggable怎么用?怎么写一个拖拽的看板?

项目中需要像看板一样的可以拖动的任务队列 如果自己要手写的话会很麻烦,大佬当我没说。市面上目前有很多成熟的组件,本次介绍的这个就是一个轻量级的应用。 sortable.js中文文档 - itxst.com 常规的vue文件使用,可以参考上面的网站。 本次…

C语言习题练习10--指针

1.代码结果 #include <stdio.h> int main() {int arr[] {1,2,3,4,5};short *p (short*)arr;int i 0;for(i0; i<4; i){*(pi) 0;}for(i0; i<5; i){printf("%d ", arr[i]);}return 0; } 正常&#xff1a;0001--00 02--00 03--00 04--00 05 数组内部是倒…

[附源码]java毕业设计医院管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【转】数据库索引详细介绍

原文链接&#xff1a;https://blog.csdn.net/weixin_41948075/article/details/100009848 索引的定义 索引相当于一本书的目录&#xff0c;通过目录我们可以迅速定位书中要找的内容。MySQL中的索引也是一样&#xff0c;它是一种帮助MySQL高效获取数据的数据结构&#xff08;树…

Docker中php安装redis扩展

第一步&#xff1a;下载redis扩展压缩包 点击下载redis-5.3.7 &#xff0c;其他版本请访问&#xff1a;https://pecl.php.net/package/redis 第二步&#xff1a;加压压缩包 linux下解压&#xff1a;tar -zxvf redis-5.3.4.tgz windows下解压&#xff1a;自己学习 第三步&#…

暴雪网易事件大讨论:Web3游戏未来发展趋势

最近很多小伙伴们询问进群方式&#xff0c;希望能和NFT玩家&#xff0c;链游行家和数字艺术家们交流和学习&#xff0c;直接戳我【ID:cdf0822】就好&#xff01;文末也有联系方式&#x1f618; 11月17日下午&#xff0c;暴雪中国官方直接绕过现任代理商网易直接发布公告称&…

学生HTML个人网页作业作品 使用HTML+CSS+JavaScript个人介绍博客网站 web前端课程设计 web前端课程设计代码 web课程设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【考研数学】概率论与数理统计

这个知识点比较零碎。 文章目录1. 基础知识&#xff1a;连续型总体的最大似然估计法2. 解题技巧&#xff1a;随机变量函数的分布3. 解题技巧&#xff1a;几何数列求和4. 基础知识&#xff1a;切比雪夫不等式5. 基础知识&#xff1a;卡方分布&#xff0c;t分布&#xff0c;F分布…

如何深刻理解RPA?相关知识点看这里!

最近RPA大热&#xff0c;但对于RPA的理解大家都是模模糊糊的&#xff0c;那如何深刻理解呢&#xff1f;需要了解哪些知识点呢&#xff1f;这里我们简单来看看吧&#xff01; 一、RPA定义 RPA简单来说就是借助一些能够自动执行的脚本&#xff0c;以软件自动化方式实现一系列原来…

昔年邢台稻田不下万顷 国稻种芯·中国水稻节:河北谷子收获

昔年邢台稻田不下万顷 国稻种芯中国水稻节&#xff1a;河北谷子收获 新华社记者 骆学峰 摄 河北新闻网讯&#xff08;河北日报记者邢云 通讯员王聚芬&#xff09; 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三…

限制用户上传文件类型

在上传文件时&#xff0c;在表单元素中设置accept属性&#xff0c;这个属性只能与<input type"file">一起使用才生效。 accept的属性值是MIME值&#xff0c;MIME值对应的文件类型可以看这个链接 菜鸟编程-MIME类型l 例如&#xff0c;我只想要用户上传的文件是p…

【雷达干扰】基于matlab速度聚类欺骗式干扰仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

微信预约课程小程序开发_分享微信预约课程小程序的好处

不管是素质拓展还是知识培训&#xff0c;教育机构的人一多&#xff0c;只靠人工的话&#xff0c;容易发生学生约课难&#xff0c;老师排课乱等问题。这时候&#xff0c;就要借助专业的约课系统小程序的帮助啦&#xff01;小程序需自带的营销功能还能帮忙拓客&#xff0c;这下招…

APIMapper 源码解析

git 地址&#xff1a;https://gitee.com/shaokang123/api-mapper 1、ApiMapper 是什么&#xff1f; 将API请求映射到接口上&#xff0c;返回封装的JavaBean数据。所以ApiMapper包括两部分功能&#xff0c; API请求接口映射 JSON数据转JavaBean对象 2、ApiMapper 中使用的设计…

IP-Guard管控应用程序运行有哪几种方式?

有五种方式可以管控应用程序运行&#xff1a; 1、通过进程名称来禁止 管理员直接添加应用程序的名称&#xff0c;如thunder.exe&#xff0c;此时策略是通过字符串匹配的&#xff0c;如果客户端修改了应用程序名称改为thunder123.exe&#xff0c;则策略就无法生效&#xff1b;要…

跟艾文学编程 《零基础入门学Python》Jupyter Notebook安装和使用

作者&#xff1a; 艾文&#xff0c;计算机硕士学位&#xff0c;企业内训讲师和金牌面试官&#xff0c;公司资深算法专家&#xff0c;现就职BAT一线大厂。 邮箱&#xff1a; 1121025745qq.com 内容&#xff1a;跟艾文学编程《零基础入门学Python​​​​​​​》 本节内容 ● Ju…

Kotlin基础入门 - 创建、兼容一个属于自己的Kotlin项目

这应该是我年前就想记录的一个基础入门&#xff0c;但是因为一直比较忙&#xff0c;当时只是做了一个备忘草稿&#xff0c;正文就拖到了现在&#xff0c;趁着有时间&#xff0c;赶紧来帮助一下新入行的朋友… 关于为何我把这篇Blog叫做 创建、兼容一个属于自己的Kotlin项目? 主…

[附源码]计算机毕业设计JAVA面向服装集群企业的个性化定制服务系统

[附源码]计算机毕业设计JAVA面向服装集群企业的个性化定制服务系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…