当前位置: 首页 > news >正文

常见分布式ID解决方案的优缺点

分布式系统之所以难,很重要的原因之一是“没有一个全局时钟,难以保证绝对的时序”。

一、分布式ID的特性或要求:

  • 唯一性:确保生成的ID是应用系统内唯一。
  • 高可用性:确保任何时候都能正确的生成ID。
  • 有意义:或者说包含更多信息,例如时间、业务等信息。如:有序性,通常都需要保证生成的 ID 是有序递增的。例如,在数据库存储等场景中,有序 ID便于确定数据位置,往往更加高效
  • 紧凑性:ID 的大小可能受到实际应用的制约,例如数据库存储往往对长 ID不友好,太长的ID 会降低 MySQL 等数据库索引的性能;

二、分布式ID的生成方案

1. UUID

算法的核心思想是结合机器的网卡、当地时间、一个随记数来生成UUID。

优点:本地生成,生成简单,性能好,没有高可用风险

缺点:长度过长,存储冗余,且无序不可读,查询效率低

2. 数据库自增ID

使用数据库的id自增策略,如 MySQL 的 auto_increment。并且可以使用两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。

优点:数据库生成的ID绝对有序,高可用实现方式简单

缺点:

  • 需要独立部署数据库实例,成本高,有性能瓶颈
  • 可用性难以保证:数据库常见架构是一主多从+读写分离,生成自增ID是写请求,主库挂了就玩不转了
  • 扩展性差,性能有上限:因为写入是单点,数据库主库的写性能决定ID的生成性能上限,并且难以扩展

优点:避免了每次生成ID都要访问数据库并带来压力,提高性能

缺点:属于本地生成策略,存在单点故障,服务重启造成ID不连续

自增ID选择bigint类型,bigint的范围是 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。可以批量生成ID,一次按需批量生成多个ID,每次生成都需要访问数据库,将数据库修改为最大的ID值,并在内存中记录当前值及最大值。

假设每天100万记录,你可以使用922,337,203,685天,也就是 2,562,047,788 年。

3. Redis生成ID(推荐)

Redis的所有命令操作都是单线程的,本身提供像 incr 和 increby 这样的自增原子命令,所以能保证生成的 ID 肯定是唯一有序的。

优点:不依赖于数据库,灵活方便,且性能优于数据库;数字ID天然排序,对分页或者需要排序的结果很有帮助。

缺点:如果系统中没有Redis,还需要引入新的组件,增加系统复杂度&#x

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 什么是多组学整合
  • 数据采集-->kafka-->hdfs
  • web服务器相关知识
  • windows本地kafka和zookeeper单机版
  • 【Linux】系列入门摘抄笔记-8-权限管理chmod/chown
  • 【排序篇】插入排序与选择排序
  • LabVIEW优化内存使用
  • 运行微信小程序报错:Bad attr data-event-opts with message
  • 数据结构与算法 - 设计
  • Oracle(75)什么是统计信息(Statistics)?
  • 云计算运维和SRE是一回事儿吗?有什么区别?
  • 点云倒角距离(Chamfer Distance,CD)
  • PPT:某集团企业IT治理优化方案
  • c语言基础------数组指针
  • C++入门:C语言到C++的过渡
  • hexo+github搭建个人博客
  • flask接收请求并推入栈
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS编译提示和导航提示
  • jdbc就是这么简单
  • Laravel Mix运行时关于es2015报错解决方案
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • WePY 在小程序性能调优上做出的探究
  • 汉诺塔算法
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用 Docker 部署 Spring Boot项目
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 在Unity中实现一个简单的消息管理器
  • Prometheus VS InfluxDB
  • puppet连载22:define用法
  • ​TypeScript都不会用,也敢说会前端?
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #Lua:Lua调用C++生成的DLL库
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (160)时序收敛--->(10)时序收敛十
  • (2)STM32单片机上位机
  • (33)STM32——485实验笔记
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (待修改)PyG安装步骤
  • (规划)24届春招和25届暑假实习路线准备规划
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)WLAN定义和基本架构转
  • (译) 函数式 JS #1:简介
  • (转)创业家杂志:UCWEB天使第一步
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Remoting学习笔记(三)信道
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET框架设计—常被忽视的C#设计技巧
  • .Net面试题4
  • .net中生成excel后调整宽度