分布式 ID 生成的五种方法:优缺点与适用场景

0.简介

在分布式系统中,生成全局唯一的id是一个常见的需求。由于分布式系统的特性(多节点,网络分区,时钟不同步等),传统的单机ID生成方式不再适用,所以一些分布式生成方式应运而生,本文将对常见的几种分布式ID生成方法的原理和应用进行介绍。

1.分布式ID的生成要求

分布式ID的生成一般要满足以下要求:
1)全局唯一:生成的 ID 必须在整个系统中唯一。
2)高性能:ID 生成的速度要快,不能成为系统的瓶颈。
3)高可用:ID 生成服务必须高可用,不能因为单点故障导致系统不可用。
4)趋势递增:生成的 ID 最好具有递增趋势,便于数据库索引和排序。

2.数据库自增方式

数据库的自增方式生成分布式ID就是使用数据库的自增列来实现,其优缺点如下:
优点:
1)使用简单,直接使用数据库已有的自增功能;

2)能够保证唯一性和递增性;

缺点:

1)性能瓶颈,在高并发场景下,数据库可能成为性能瓶颈;

2)可用性问题,存在单点故障可能;

使用场景:主要适用小规模分布式系统,对性能要求不高的场景。

在这里插入图片描述

改进方式:
1)冗余主节点,避免单点写入。
在这里插入图片描述

2)批量生成id,降低读写频率。其不需要挨个获取,一次获取多个同时更新max-id,下次就继续在max-id增加。
在这里插入图片描述

3.UUID

UUID(Universally Unique Identifier)是一个 128 位的全局唯一标识符,通常表示为 32 个十六进制字符,例如:

550e8400-e29b-41d4-a716-446655440000

优点:
1)简单易用:无需中心化服务,每个节点都可以独立生成 UUID。
2)全局唯一:UUID 的生成基于时间戳、随机数和 MAC 地址,几乎不可能重复。
3)性能个扩展性好:本地生成,没有扩展和性能瓶颈。
缺点:
1)长度较长:128 位的 UUID 存储和传输以及查询开销较大,可以拆成两个uint64整数存储。
2)无序性:UUID 是随机生成的,不具备递增趋势,不利于数据库索引。
适用场景:对ID长度以及有序性要求不高的场景。
改进方式:
1)可以增加时间信息,如在开头增加毫秒数,优点就是能保证递增;缺点就是可能在同一时间的话可能会出现冲突。

4.Snowflake算法

4.1 原理

Snowflake 是 Twitter 开源的分布式 ID 生成算法,生成的 ID 是一个 64 位的整数,结构如下:

1 bit41 bits10 bits12 bits
signtimestampmachine IDsequence

sign:符号位,固定为 0。

timestamp:41 位的时间戳,表示从某个起始时间到当前时间的毫秒数。

machine ID:10 位的机器 ID,用于区分不同的节点。

sequence:12 位的序列号,用于同一毫秒内生成多个 ID。
优点:

1)高性能:本地生成 ID,无需网络通信。

2)趋势递增:ID 按时间戳递增,便于数据库索引。

3)高可用:无中心化服务,每个节点独立生成 ID。
缺点:

1)时钟回拨问题:如果系统时钟回拨,可能导致 ID 重复。

2)机器 ID 分配:需要手动或通过外部服务分配机器 ID。
适用场景:大规模分布式系统,对性能和有序性要求较高的场景。

改进方式:可以通过等待时间同步解决时钟回拨,通过扩展时间位来解决时间一出,通过动态机器id分配解决手动分配问题。

5.Redis自增ID

该方法是利用 Redis 的原子操作 INCR 或 INCRBY 生成全局唯一的 ID。

使用 Redis 的 INCR 命令生成自增 ID:

INCR id_generator

如果需要生成更长的 ID,可以使用

INCRBY id_generator 1000

优点:
1)高性能:Redis 的 INCR 操作是原子性的,性能较高。
2)简单易用:实现简单,无需复杂的算法。

缺点:
1)依赖 Redis:需要维护 Redis 服务,存在单点故障风险。

2)ID 长度有限:Redis 的 INCR 生成的 ID 是 64 位整数,可能不够用。

适用场景:中小规模分布式系统,对性能和有序性有一定要求的场景。
改进方式:可以参考数据库自增id方式优化。

6.Leaf算法

Leaf 是美团开源的分布式 ID 生成服务,结合了数据库和 Snowflake 算法的优点。它支持两种模式:

1)号段模式:从数据库批量获取 ID 段,缓存在本地。

2)Snowflake 模式:基于 Snowflake 算法生成 ID。

优点:
1)高性能:号段模式减少了数据库访问次数,Snowflake 模式本地生成 ID。

2)高可用:支持多节点部署,无单点故障。

3)灵活配置:支持号段模式和 Snowflake 模式切换。

缺点:
1)复杂度较高:需要部署和维护 Leaf 服务。

适用场景:大规模分布式系统,对性能和可用性要求较高的场景。
分布式id生成的五种方法

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

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

相关文章

基于单片机路灯自动控制仪仿真设计

标题:基于单片机路灯自动控制仪仿真设计 内容:1.摘要 本设计旨在解决传统路灯控制方式效率低、能耗大的问题,开展了基于单片机的路灯自动控制仪仿真设计。采用单片机作为核心控制单元,结合光照传感器、时钟模块等硬件,运用相关软件进行编程和…

计算机网络-MPLS VPN基础概念

前面几篇文章我们学习了MPLS的标签转发原理,有静态标签分发和LDP动态标签协议,可以实现LSR设备基于标签实现数据高效转发。现在开始学习MPLS在企业实际应用的场景-MPLS VPN。 一、MPLS VPN概念 MPLS(多协议标签交换)位于TCP/IP协…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口,通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

windows 安装gdal实现png转tif,以及栅格拼接

windows 安装gdal实现png转tif,以及栅格拼接 一、安装gdal 网上有很多安装gdal的方法,此处通过osgeo4w安装gdal 1.下载osgeo4w 下载地址 https://trac.osgeo.org/osgeo4w/ 2、安装osgeo4w exe文件安装,前面部分很简单,就不再…

Node.js 源码概览

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它的源码结构相当庞大且复杂。下面我将为你讲解 Node.js 源码的主要结构和关键组成部分。 源码结构 Node.js 的主要源码目录结构如下: node/ ├── lib/ # JavaScript 核心模…

Linux :线程 【生产者消费者模型】

Linux :线程 【生产者消费者模型与信号量】 (一)生产消费模型1、生产消费模式概念2、生产者消费者之间的关系3、生产者消费者模型优点 (二)基于BlockingQueue的生产者消费者模型1、基于阻塞队列模型2、模拟实现基于阻塞…

mac本地docker镜像上传指定虚拟机

在Mac本地将Docker镜像上传至指定虚拟机的完整步骤 1. 在Mac本地保存Docker镜像为文件 通过docker save命令将镜像打包为.tar文件,便于传输至虚拟机。 # 示例:保存名为"my_image"的镜像到当前目录 docker save -o my_image.tar my_image:ta…

C++跨平台开发经验与解决方案

在当今软件开发领域,跨平台开发已成为一个重要的需求。C作为一种强大的系统级编程语言,在跨平台开发中扮演着重要角色。本文将分享在实际项目中的跨平台开发经验和解决方案。 1. 构建系统选择 CMake的优势 跨平台兼容性好 支持多种编译器和IDE 强大…

Void: Cursor 的开源平替

GitHub:https://github.com/voideditor/void 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Void,这款编辑器号称是开源的 Cursor 和 GitHub Copilot 替代品,而且完全免费! 在你的代码库…

基于HTML+JavaScript+CSS实现教学网站

摘要 21世纪是信息化的时代,信息化物品不断地涌入我们的生活。同时,教育行业也产生了重大变革。传统的身心教授的模式,正在被替代。互联网模式的教育开辟了一片新的热土。 这算是对教育行业的一次重大挑战。截至目前,众多教育行…

基于ssm+mysql的高校设备管理系统(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能:系统登录、员工管理、设备管理、设备采购统计、设备报废统计;用户角色功能:设备采购管理、设备报废管理、个人资料管理。 作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vu…

电力杆塔安全监测解决方案

一、方案背景 在台风、滑坡等自然灾害出现时,极易产生倒杆、断杆、杆塔倾斜、塔基滑动等致使杆塔失稳的状况,进而引发导线断线、线路跳闸等事故,给电网的安全稳定运行造成影响。可借助在铁塔上装设的传感器,能够感知铁塔的工作状态…

基于Quicker构建从截图到公网图像链接获取的自动化流程

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言预备内容转webp程序PicGo设置Quicker设置视频演示总结互动致谢参考 前言 在自建博…

Python Requests库完全指南:从入门到精通

引言 在Python的生态系统中,requests库以其简洁优雅的API设计和强大的功能,成为HTTP请求处理领域的标杆工具。无论是数据爬虫开发、API接口调用,还是自动化测试场景,requests都能将复杂的网络交互简化为几行可读性极高的代码。相…

渗透测试核心技术:内网渗透与横向移动

内网渗透是红队行动的关键阶段,攻击者通过突破边界进入内网后,需快速定位域控、横向移动并维持权限。本节从内网环境搭建、信息收集、横向移动技巧到权限维持工具,系统讲解如何在内网中隐蔽行动并扩大战果。 1. 内网环境搭建与基础配置 目标: 模拟真实企业网络,构建包含…

学习FineBI

FineBI 第一章 FineBI 介绍 1.1. FineBI 概述 FineBI 是帆软软件有限公司推出的一款商业智能 (Business Intelligence) 产品 。 FineBI 是新一代大数据分析的 BI 工具 , 旨在帮助企业的业务人员充分了解和利用他们的数据 。FineBI 凭借强…

CSS 浮动(Float)及其应用

1. 什么是浮动(Float)? 浮动元素会脱离正常的文档流(Document Flow),并向左或向右移动,直到碰到父元素的边缘或另一个浮动元素。 基本语法 .float-left {float: left; }.float-right {float:…

二分算法的介绍简单易懂

目录 1.概论 2.朴素的二分算法 3.求左端点的二分算法和求右端点的二分算法 4.总结 1.概论 要想了解什么是二分算法,我们就要知道什么是二分算法,二分算法是根据数组的规律,每次查找的数据原来的效率可能要O(n),而我…

ROS2学习(3)------架构概述

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 ROS版本:2 ROS 2(Robot Operating System 2)的设计旨在提供一个灵活、可扩展且高效的框架,用于编写复杂的机器人软件。它引入了发布者/订阅者&…

墨水屏显示模拟器程序解读

程序如下&#xff1a;出处https://github.com/tsl0922/EPD-nRF5?tabreadme-ov-file // GUI emulator for Windows // This code is a simple Windows GUI application that emulates the display of an e-paper device. #include <windows.h> #include <stdint.h>…