分布式ID之雪花算法

1. Seata对雪花算法生成ID的改良

  • 滑动验证页面  (含代码&讲解)
  • Seata基于改良版雪花算法的分布式UUID生成器分析:时间戳和节点ID位置进行了调换。官网:Seata基于改良版雪花算法的分布式UUID生成器分析 | Apache Seata关于新版雪花算法的答疑 | Apache Seata

  • Seata内置分布式ID的代码位置:io.seata.common.util.IdWorker,可以直接使用;

  • com.baomidou.mybatisplus.core.toolkit.IdWorker也有ID生成器。

2. 雪花算法原理

雪花算法(Snowflake Algorithm)是一种生成全局唯一ID的分布式算法,由Twitter公司开发。它的主要思想是将时间戳、工作节点标识和序列号组合成一个64位的整数,结构如下:

  1. 未使用位(1位):最高位未使用,保持为0,因为二进制中最高位为1表示负数,而雪花算法生成的ID是正数。
  2. 时间戳(41位):接下来的41位表示毫秒级的时间戳,能够表示大约69年的毫秒数。
  3. 数据中心和工作机器ID位(10位):接下来的5位表示数据中心ID,接下来的5位表示工作机器ID,合计10位,可以表示最多32个数据中心,每个数据中心最多32台工作机器,共1024台机器。
  4. 序列号位(12位):最后的12位表示同一毫秒内产生的不同ID,能够表示的最大数量为4096。

雪花算法的工作流程大致如下:

  • 获取时间戳:生成或获取当前时间的毫秒级时间戳。
  • 机器ID配置:每台机器配置唯一的机器ID。
  • 序列号管理:在同一毫秒内,使用计数器或其他方式生成序列号,确保不超过12位的限制。
  • 组合生成ID:将时间戳、机器ID和序列号按照指定的顺序组合起来,生成一个64位的长整型ID。

雪花算法能够在分布式系统中保证ID的唯一性和有序性,广泛用于如数据库主键、分布式系统中生成唯一标识等场景。

2.1 雪花算法中的工作节点标识如何分配?

在雪花算法中,工作节点标识通常被分为两部分:数据中心ID和工作节点ID,它们都是为了确保在全球范围内的分布式环境中能够生成全局唯一的ID。以下是分配方法:

  1. 确定数据中心数量:首先,你需要知道你的系统中有多少个数据中心或者机房。这些数据中心会被分配到5位的二进制编码中。

  2. 分配数据中心ID:给每个数据中心分配一个唯一的ID,这个ID需要在0到(2^5)-1之间,即0到31。例如,第一个数据中心可以分配0,第二个分配1,以此类推。

  3. 确定工作节点数量:在每个数据中心内,你可以有多个工作节点或服务器。同样,这些节点也需要唯一的ID。给每个工作节点分配一个5位的二进制编码,在0到(2^5)-1之间,但是要确保每个数据中心内的ID不能重复。

  4. 组合数据中心ID和工作节点ID:将数据中心ID和工作节点ID拼接起来,形成一个10位的二进制数字,这就是工作节点标识。

  5. 转换为十进制:如果需要,可以将这个二进制数字转换为十进制以便于人类阅读和理解。

 

2.2 雪花算法生成的ID一共多少位?

雪花算法生成的ID总共有64位,这64位由以下几个部分组成:

  • 1位符号位:用于表示时间戳是正还是负,一般始终为0,表示正数。
  • 41位时间戳:精确到毫秒的时间戳,可以使用约69年(因为2^41 / (1000 * 60 * 60 * 24 * 365) ≈ 69)。
  • 10位工作节点ID:包括5位的数据中心ID和5位的工作节点ID,总共可以支持32个数据中心,每个数据中心最多有32个工作节点。
  • 12位序列号:在一个毫秒内,同一工作节点可以生成的最大序列号,可以支持每个节点每毫秒生成4096个ID。

2.3 雪花算法能支持多少个不同的数据中心?

雪花算法中支持的数据中心数量是2的5次方,即32个。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【平台开发】MTK6833 实现lk下CQE接口移植 - cmdq irq

1.cmdq_irq 检测中断bit 2.目前遇到问题 任务执行后,没有触发对应中断,伴有错误发生,但任务完成标志位能检测到 寄存器CQIS,CQDQS等均为0,CQTCN为任务完成寄存器看到置1,CQTERRI检测到8000错误 错误详情如下&#xf…

MATLAB : interp1()用法介绍

目录 一、基本语法: 二、实例: 1.样条拟合减振器阻尼曲线 ​2.PP拟合时间温度曲线 interp1 是 MATLAB 中的一个函数,用于在一维数据上执行插值操作。这个函数可以帮助你估计或计算已知数据点之间未知点的值。以下是 interp1 函数的基本用…

计算机网络复习和重点

一、计算机网络概述 网络发展历史、网络的定义、分类和组成、 网络协议分层模型介绍(OSI和TCP/IP模型的比较) 重点:网络协议的概念、分层 分层的目的:降低复杂性分层的好处和坏处:好处是设计简答,坏处是…

免费分享一套微信小程序扫码点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序扫码点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) ,分享下哈。 项目视频演示 【免费】微信小程序扫码点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) Java毕…

基于数据湖的企业中台解决方案

什么是数据湖? 数据湖是一个以原始格式(通常是对象块或文件)存储数据的系统或存储库。数据湖通常是所有企业数据的单一存储。用于报告、可视化、高级分析和机器学习等任务。数据湖可以包括来自关系数据库的结构化数据(行和列)、半结构化数据(CSV、日志、XML、JSON)、非结构化…

封装umi-request时通过 AbortController 配置取消请求

一、关键部分 一、在封装的request.ts中 声明一个 abortControllers 对象用于存储要取消的请求(我用了-s表示复数,多个abortcontroller对象,与下面👇的单个abortController区分)封装取消请求的函数cancelRequest, 传入…

Rust Web开发实战:打造高效稳定的服务端应用

Rust Web开发实战:打造高效稳定的服务端应用 本书将带领您从零开始构建Web应用程序,无论是API、微服务还是单体应用,都将一一涵盖。您将学到如何优雅地对外开放API,如何连接数据库以安全存储数据,以及如何对应用程序进…

Mysql基础(三)DDL之create table语句

一 create table 创表 说明: create table相关语句从功能上进行讲解补充: 前面已经讲解过相关的约束,已进行相关的铺垫声明: 参考价值较少,了解即可 ① 基本语法 思考: 约束加在哪里? ② 创建新表 强调:使…

RCD吸收电路:开关电源高频干扰的有效消除器

开关电源中除了我们常规介绍的差模噪声源和共模噪声源,还存在一些其它的噪声源也应该解决,这些高频噪声源同样会带来电磁兼容问题,因此我们需要关注。这里介绍两种干扰源,一种是MOS管的通断带来的高频振荡噪声,另一种是…

Eclipse C++ 无法debug 问题

环境: ubuntu20.04 Eclipse CDT(x86_64) 工程,使用的是默认的CMake Project 现象: 1. 使用Eclipse, 加了断点后,debug 无法停在断点;step over 执行后是从main 直接执行到exit &#xff…

ubuntu24.04 正式放弃VNC

1、ubuntu22.04支持情况 去年9月在22.04中测试发现由于gnome启用Wayland桌面,然而Wayland和vnc兼容不佳,就已经黑屏等问题,当时是vnc和ms-rd(微软远程桌面)两个菜单。 Ubuntu22.04 vnc远程黑屏_ubuntu 远程桌面vnc黑屏-CSDN博客文章浏览阅读…

鸿蒙开发HarmonyOS4.0入门与实践

鸿蒙开发HarmonyOS4.0 配合视频一起食用,效果更佳 课程地址:https://www.bilibili.com/video/BV1Sa4y1Z7B1/ 源码地址:https://gitee.com/szxio/harmonyOS4 准备工作 官网地址 鸿蒙开发者官网:https://developer.huawei.com/con…

u盘量产工具拥有分区功能,它把一个U盘分成数个移动盘,更改U盘介质类型(Fixed 和 Removabe),供大家学习研究参考~

非常受欢迎的u盘量产工具。最新版拥有分区功能,它把一个U盘分成数个移动盘,更改U盘介质类型(Fixed 和 Removabel)。数码之家量产工具官方版不是数据恢复,是对U盘底层硬件信息的恢复(非硬件损坏),使因为底层硬件信息受损电脑无法识…

【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断

项目源文件:https://download.csdn.net/download/qq_61814350/89222788?spm1001.2014.3001.5501 实验内容: 1、编写程序,设置主程序:跑马灯以 0.2s 的速度旋转;将 KB1 设置为外部中断,下 降沿触发&…

在ubuntu 24.04 上安装vmware workstation 17.5.1

ubuntu安装在新组装的i9 14900机器上,用来学习笨叔的ARM64体系结构编程,也熟悉Linux的用法。但有时候写文档总是不方便,还是需要window来用。因此想在ubuntu 24.04上安装Linux版本的vmware worksation 17.5.1以虚拟机的方式安装windows 11。其…

【软测学习笔记】测试入门Day03

🌟博主主页:我是一只海绵派大星 📚专栏分类:软件测试笔记 📚参考教程:黑马教程❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、缺陷 1、定义 2、缺陷标准 3、缺陷产生的原因 4、缺陷的生命周…

Leetcode—1329. 将矩阵按对角线排序【中等】(unordered_map、priority_queue)

2024每日刷题&#xff08;121&#xff09; Leetcode—1329. 将矩阵按对角线排序 实现代码 class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {const int m mat.size();const int n mat[0].size();unorder…

指导网友完成一起Linux服务器系统文件删除导致不能启动情况下的数据恢复案例

昨日有网友在微信群发起救助&#xff0c;Linux系统不能启动&#xff0c;使用救援U盘也无法恢复&#xff0c;协助他进行了数据恢复&#xff0c;本文记录了处置过程。 图片为网友提供&#xff0c;照得歪歪扭扭的&#xff0c;将就着看看吧。 一、问题现象 1、报错信息 Linux服…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

Discuz! X系列版本安装包

源码下载地址&#xff1a;Discuz! X系列版本安装包 很多新老站长跟我说要找Discuz! X以前的版本安装包&#xff0c;我们做Discuz! X开发已经十几年了&#xff0c;这些都是官方原版安装包&#xff0c;方便大家使用&#xff08;在官网已经找不到这些版本的安装包了&#xff09; …