分布式系统中的唯一ID生成方法

通常在分布式系统中,有生成唯一ID的需求,唯一ID有多种实现方式。我们选择其中几种,简单阐述一下实现原理、适用场景、优缺点等信息。

目录

  • 数据库多主复制
  • UUID
  • 工单服务器
  • 雪花算法
  • 总结

数据库多主复制

数据库通常有自增属性,在单机数据库场景中自增的步长通常是1。但是,在分布式场景中,往往存在多个数据库,此时数据库自增的步长不再是1,而应该是k, k为数据库的个数。

例如有三个数据中心,A,B,C。那么步长应该为3 ,A生成的ID依次是1, 4,7, …;B生成的ID为 2,5,8,… ;C生成的步长为3,6,9…

缺点:无法灵活扩展或者收缩,当需要增加或者减少数据库数量时,调整步长会很麻烦,需要额外的同步和协作。升成的唯一ID可能是不连续的,非递增的。

适用场景:适合数据中心数量稳定,且不要求ID单调增的场景。

UUID

UUID是一个128位数据,且重复的概率极低,可忽略不计。有很多现成的接口可供调用。

UUID与时间、识别号等信息有关,也有多种格式,如GUID、标准UUID等。具体的详细信息,请参考文章https://zhuanlan.zhihu.com/p/438580928

优点:生成简单,不需要各个服务器之间协同。可以任意扩展服务器数量,而不受影响。

缺点:ID是非单调增的,不连续的。ID是非数字的,可能包含字母。

工单服务器

工单服务器由Flicker公司实现。一个Flickr Ticket服务器只包含一个独立的nysql数据库服务,结合MySQL的“REPLACE INTO”扩展,就能获取到一个ID。

详细的原理和使用方法请参考文章:Ticket Servers: Distributed Unique Primary Keys on the Cheap[https://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/]。文中也讲述了单点故障问题的解决方法。

优点:ID是单调增的,是纯数字的,容易实现,更适合中小型应用。

缺点:可能存在单点故障,官方虽然给了解决方法,但是也正如官方所说的,不够优雅。

雪花算法

雪花算法由推特公司(如今的X公司)实现。这里就不详细介绍了,相信很多大佬讲解的更好更详细。主要思想是,将ID分成多个部分,每个部分单独生成,这样就很大程度避免了重复问题。雪花算法将64位的ID分成了五部分:

在这里插入图片描述

具体每个部分的长度,可以根据实际需要灵活调整。

优点:ID是纯数字的,ID是单调增的,适合中大型服务。

缺点:分布式场景中时间不同步,会导致生成ID存在偏差。如果发生始终回拨,会导致生成的ID错乱,典型的例子就是NSQ消息队列中使用雪花算法生成消息ID,但是当时间变化时,直接导致消息队列不工作,坑苦了我们!!

总结

该文只是简单的总结了一些不同的唯一ID生成方法,可能不全面,不能说哪个一定好,哪个一定差,关键是找到合适自己的,也可以在已有的方法上做针对性修改。如果文中有错误,请各位批评指正!

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

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

相关文章

CSS 实现无限波浪边框卡片

CSS 实现无限波浪边框卡片 效果展示 鼠标悬停效果,底部色块的边框是无限滚动的波浪 鼠标没有悬停效果 CSS 知识点 CSS 基础知识回顾使用 radial-gradient 实现波浪边框使用 anumate 属性实现波浪边框动画和控制动画运动 波浪实现原理 波浪边框的实现思路其…

dayjs 判断是否今天、本周内、本年内、本年外显示周几、月份等

效果: 判断是否今天需从 dayjs 中引入 isToday 插件; 判断是否两个日期之间需从 dayjs 中引入 isBetween 插件 import dayjs from dayjs import isToday from dayjs/plugin/isToday import isBetween from dayjs/plugin/isBetween// 注册插件 dayjs.extend(isBet…

浅谈对线程的理解

一、线程的概念 1、线程的概念 在Python中,想要实现多任务还可以使用多线程来完成。 2、为什么使用多线程? 进程是分配资源的最小单位 , 一旦创建一个进程就会分配一定的资源 , 就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的 . 线程是…

DP:子数组模型

一、最大子数组和 . - 力扣&#xff08;LeetCode&#xff09; 二、环形子数组的最大和 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {//动态规划思想解决 //环形数组问题&#xff0c;尝试转…

01-Git 快速入门

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list再检查C:\Users\xxx.ssh 下是否存在 id_rsa.pub , 存在的话复制其内容到 GitHub 的 SSH KEY 中 没有这一步, PUSH操作的时候会报错:…

土壤墒情监测系统:洞察土壤水分奥秘

TH-TS400土壤墒情监测系统&#xff0c;作为现代农业科技的重要组成部分&#xff0c;已经成为农业生产过程中不可或缺的一环。该系统通过先进的传感器技术和数据处理能力&#xff0c;能够实时监测土壤的水分状况&#xff0c;为农业生产提供精准、可靠的数据支持。本文将从系统构…

存储设备与网络监控运维实践

随着企业数据量的不断增长和网络架构的日益复杂&#xff0c;存储设备和网络设施的稳定运行变得至关重要。为了确保这些关键组件的性能和可用性&#xff0c;实施全面的监控策略是运维团队的首要任务。本文旨在为运维团队提供存储设备监控、网络流量分析以及网络配置管理方面的参…

如何在debian12.5上安装snap和docker

在Debian 12.5上安装Snap和Docker的步骤如下&#xff1a; 1. 更新系统包列表&#xff1a; sudo apt update sudo apt upgrade 2. 安装 Snap&#xff1a; Debian 12.5 默认已经启用了 Snap 支持&#xff0c;所以你可以直接通过 apt 来安装 Snap。 sudo apt install snapd …

算法打卡day29

今日任务&#xff1a; 1&#xff09;1005.K次取反后最大化的数组和 2&#xff09;134.加油站 3&#xff09;135.分发糖果 1005.K次取反后最大化的数组和 题目链接&#xff1a;1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组 A&…

Java Web-分层解耦

三层架构 当我们所有代码都写在一起时&#xff0c;代码的复用性差&#xff0c;并且难以维护。就像我们要修改一下服务端获取数据的方式&#xff0c;从文本文档获取改为到数据库中获取&#xff0c;就难以修改&#xff0c;而使用三层架构能很好的解决这个问题。 controller: 控…

MySql数据库从0-1学习-第二天DML和DQL学习

DML 对数据库表中的数据进行增删改操作 Insert 语法 //指定字段添加数据 insert into 表名(字段名1,字段名2) values (值1,值2);//全部字段添加数据: insert into 表名 values(值1,值2...);//批量添加数据(指定字段) insert into 表名(字段名1,字段名2) values(值1,值2),(值1,…

HJ61 放苹果(递归,苹果多的情况+盘子多的情况)

当苹果数 < 盘子数&#xff0c;有空盘&#xff0c;则忽略一个盘子&#xff0c;在n-1个放苹果&#xff0c;一直递推到n1&#xff0c;有一种摆法苹果数 > 盘子数&#xff0c;可以看作没有空盘。则可以选择忽略一个盘子&#xff0c;如上边做法。还可以选择每个盘子放一个苹果…

react ant design 通过函数弹出 modal窗口

在React Ant Design中&#xff0c;可以通过调用Modal组件的方法来动态弹出和关闭Modal窗口。具体步骤如下&#xff1a; 1、首先&#xff0c;在组件中引入Modal组件&#xff1a; import { Modal } from antd;2、在组件中定义一个函数来弹出Modal窗口&#xff1a; const showM…

GlusterFS分布式存储

目录 前言 一、GlusterFS分布式存储概述 1、GFS概念 2、GFS特点 3、GFS术语 4、GFS构成 5、GFS工作流程 6、后端存储如何定位文件 7、GlusterFs的卷类型 7.1 Distributed Volume&#xff08;分布式卷&#xff09; 7.2 Striped Volume&#xff08;条带卷&#xff09…

Pgsql怎样找到表中某个字段值重复的记录并删除冗余记录,只保留一条

背景 今天发现某个黄页爬取的数据有部分重复了&#xff0c;原本我用的公司详情页的url进行md5来作为主键做upsert入&#xff0c;但后面在核验数据时发现有些详情url虽是同一间公司的&#xff0c;但路由上有细微差别导致写入了重复的公司数据&#xff0c;所以要想办法清理掉重复…

线性变换在人工智能领域的深度实践与应用探索

线性变换&#xff0c;作为数学中的一种基本工具&#xff0c;在人工智能领域中发挥着举足轻重的作用。其强大的表示能力和灵活的运算特性使得线性变换成为机器学习、深度学习等多个子领域的核心组成部分。本文将详细探讨线性变换在人工智能领域中的实践应用&#xff0c;旨在揭示…

redis分布式锁介绍及代码示例

Redis 分布式锁是一种利用 Redis 实现的分布式系统中的锁机制&#xff0c;用于在分布式环境下控制多个客户端对共享资源的访问。它通过 Redis 的原子性操作来确保在分布式系统中的不同节点上&#xff0c;同一时刻只有一个客户端能够获取到锁&#xff0c;从而保证了对共享资源的…

自动化测试selenium

目录 什么是自动化测试 什么是selenium selenium工作原理 selenium环境搭建 1.查看chrome浏览器版本 2.下载chrome浏览器驱动 3.配置系统环境变量PATH 4.验证环境是否搭建成功 selenium相关API 1.定位元素 CSS选择器定位 xpath定位元素 标签定位元素 2.操作测试对…

2024年华为OD机试真题-孙悟空吃蟠桃-Python-OD统一考试(C卷)

题目描述: 孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。 孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间…

novnc本地文件读取和写入权限

在使用NoVNC&#xff08;一种基于Web的VNC客户端&#xff09;时&#xff0c;出于安全考虑&#xff0c;通常不允许直接从客户端访问或修改服务器上的文件系统。如果你需要在NoVNC中实现文件的读写&#xff0c;你可能需要使用一些特殊的配置或者服务器端的支持。 例如&#xff0…