分布式id实战

目录

常用方式

特征

潜在问题

信息安全

高性能

UUID

雪花算法

数据库生成

美团Leaf方案

[Leaf-segment 数据库方案](#Leaf-segment 数据库方案)

[Leaf-snowflake 方案](#Leaf-snowflake 方案)


常用方式

  • uuid
  • 雪花算法
  • 数据库主键

特征

  • 全局唯一
  • 趋势递增
  • 信息安全

潜在问题

信息安全

  • 如果id连续递增, 容易被爬虫, 批量下载数据
  • 如果订单id是连续递增, 容易被竞争对手推算出日交易量, 这时候需要ID不规则
  • 可能泄漏本机mac地址

高性能

保证在高qps时候, 系统也高可用, 延迟低

UUID

标准型式包含 32 个 16 进制数字,以连字号分为五段,形式为 8-4-4-4-12 的 36 个字符.

示例:ecb02c7d-0a3f-4c00-85f6-aa5c6962eb4d

优点: 本地生成, 性能高, 没有网络消耗

缺点:

  • UUID太长不易储存, 16字节, 128位
  • 信息不安全. 基于 MAC 地址生成UUID的算法, 可能造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置
  • 不适合做DB主键. 数据库主键应该越短越好, uuid随机性, 导致聚集索引的数据频繁变动, 影响性能

雪花算法

  • 第 0 位: 符号位(标识正负),始终为 0,没有用,不用管。
  • 第 1~41 位 :一共 41 位,用来表示时间戳,单位是毫秒,可以支撑 2 ^41 毫秒(约 69 年)
  • 第 42~52 位 :一共 10 位,一般来说,前 5 位表示机房 ID,后 5 位表示机器 ID(实际项目中可以根据实际情况调整),这样就可以区分不同集群/机房的节点,这样就可以表示 32 个 IDC,每个 IDC 下可以有 32 台机器。
  • 第 53~64 位 :一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。理论上 snowflake 方案的 QPS 约为 409.6w/s

优点:

  • 顺序递增, 时间戳在高位, 自增序列在地位
  • 本地生成, 不依赖第三方主键, 稳定性更高, 性能高
  • 可以根据自身业务, 灵活分配bit位

缺点:

存在时钟回拨问题

数据库生成

  • mysql自增主键
  • redis的incr命令
  • mongodb的ObjectId
  • zookeeper顺序节点

美团Leaf方案

Leaf 这个名字是来自德国哲学家、数学家莱布尼茨的一句话:

There are no two identical leaves in the world("世界上没有两片相同的树叶")

​Leaf 分别在 MySQL 和雪花上做了相应的优化,实现了 Leaf-segment 和 Leaf-snowflake 方案。

Leaf-segment 数据库方案

==

Leaf-snowflake 方案

==

相关推荐
_Evan_Yao42 分钟前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd1 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼1 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122662 小时前
TCP 1
java·1024程序员节
金銀銅鐵4 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手5 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck6 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428047 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑7 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔8 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节