Java面试28-谈谈常用的分布式ID设计方案

首先,分布式全局ID的解决方案有很多,比如:

  • 使用Mysql的全局表
  • 使用Zookeeper的有序节点
  • 使用MongoDB的objectid
  • redis的自增id
  • UUID等等

这些方案只是解决基础的id唯一性问题,在实际生产环境中,需要构建一个全局唯一id还需要考虑更多的因素:

  1. 有序性,有序的ID能够更好的确认数据的位置,以及B+树的存储结构中,范围查询的效率更高,并且可以提升B+树数据维护的效率;
  2. 安全性,避免恶意爬取数据造成数据泄露;
  3. 可用性,ID生成系统的可用性要求非常高,一旦出现故障就会造成业务不可用的问题;
  4. 性能,全局ID生成系统需要满足整个公司的业务需求,涉及到亿级别的调用,对性能要求较高。

因此,如果我们选择数据库的全局表,每获取一次id就需要更新数据库,性能上限比较明显,而且基于数据库构建高扩展和高性能的解决方案难度很大。所以,目前市面上主流的解决方案是基于Twitter早期开源的snowflake雪花算法 。它是由64位长度组成的全局id生成算法,通过对64位进行区间划分来表述不同含义实现唯一性 。它的好处是:算法实现简单,不存在太多外部依赖,可以生成有意义的有序编号。基于位运算,性能也很好,Twitter测试的峰值是10万个每秒。

另外,美国公司开源了一个全局唯一id生成系统leaf,它里面也用到了雪花算法去构建全局唯一id,并且在高性能和高可用方面,做了很多优化,为美团内部业务提供了每天上亿次的调用。

相关推荐
xiangyun6125 分钟前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
骑着蜗牛撵大象32732 分钟前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly
金銀銅鐵1 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
Nuanyt2 小时前
Hot 100 刷题笔记 · 数组与哈希专题(3 题)
java·笔记·算法·leetcode·哈希算法·1024程序员节
xieliyu.2 小时前
【JavaEE进阶】Spring Boot 日志:从 System.out 到 @Slf4j,6 个级别 + 4 类配置一篇讲透
java·spring boot·spring·java-ee·springboot·logback·slf4j
莫叫石榴姐2 小时前
半导体业务数仓建模: Lot、Wafer、Die、Recipe、OEE、YMS 建模要点
数据仓库·sql·面试·职场和发展·矩阵·1024程序员节
IT_Octopus2 小时前
Apollo 配置中心入门:一所“小学校“读懂 Portal、Meta Server、Config Service
java·后端·spring
cfm_29142 小时前
偏向锁的Epoch优化机制
java
CRMEB系统商城3 小时前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节
jason.zeng@15022073 小时前
Nginx 配置详解(静态 HTML、下载目录、API 反向代理三套场景)
java·vue.js·1024程序员节