数据库|分布式id生成策略,我和面试官扯了一个半小时
文章图片
文章图片
文章图片
面试官:小伙子 , 你还记得我吗?我是上次面试你的那个面试官 。
我心想:我去 , 怎么会不记得 , 我又不是青年痴呆 , 上次害我画了那么多图 , 还使劲敲了一个多钟的电脑 , 满脑子都是你的阴影 。
我:记得记得 , 您好 , 很高兴能通过二面 , 能够继续和您交流技术问题 。
我违背良心说这话真的好吗 , 姑且就那么一次吧 , 面个试都那么难?
面试官又快速的扫了一下的简历 , 可能上次看过一次 , 都快过了一个多星期了 , 估计他都都忘了我的简历了吧 。
面试官:我看你简历上面写着深入了解分布式 , 并且也做过分布式项目 , 挺好的 , 那你知道分布式项目中生成分布式ID的方法有哪些吗?
我:这个我知道 , 生成分布式Id的方法主要有以下几种:
- 数据库自增ID 。
- 数据库水平拆分 , 设置初始值和相同的自增步长 。
- 批量申请自增ID 。
- UUID生成 。
- Redis的方式 。
- 雪花算法 。
- 百度UidGenerator算法
- 美团Leaf算法
我心想:我去 , 这下可糗大了 , 那么多 , 我只是大概知道主要的 , 怎么可能每一种都去了解和深入 , 一下子说了那么多不是给自己挖坑吗?
哎 , 没办法出来混 , 总是要还的 , 只能说自己知道的吧?不知道的大概粗糙的略过 。
数据库自增ID我:嗯嗯 , 好的 。 数据库的自增 , 很容易理解 , 开发过的人员都知道 , 在创建表的时候 , 指定主键\t
auto_increment
(自增)便可以实现 。我:但是使用数据库的自增ID , 虽然简单 , 会带来ID重复的问题 , 并且单机版的ID自增 , 并且每次生成一个ID都会访问数据库一次 , DB的压力也很大 , 并没有什么并发性能可言 。
面试官:恩额 。
我看看面试官正听着有味 , 时不时摸摸他稀少的发量额头 , 深邃的目光透露出他的沉稳 , 这可能就是一个成熟架构师的魅力吧 , 让多少码渣苦读《Java编程思想》《Java核心技术》《Effectice java》《Java并发编程实战》《代码整洁之道》《重构: 改善既有代码的设计》...... , 都无法达到的境界 , 我乘热打铁 , 接着下面的回答 。
数据库水平拆分 , 设置初始值和相同的自增步长我:针对上面的数据库自增ID出现的问题:ID重复、性能不好 。 就出现了集群版的生成分布式ID方案 。 \t「 数据库水平拆分 , 设置初始值和相同的自增步长\t」和\t「 批量申请自增ID\t」 。
我:\t「 数据库水平拆分 , 设置初始值和相同的自增步长\t」是指在DB集群的环境下 , 将数据库进行水平划分 , 然后每个数据库设置\t「 不同的初始值\t」和\t「 相同的步长\t」 , 这样就能避免ID重复的情况 。
面试官:小伙子 , 不好意思打断一下 , 你可以画个图吗 , 这个我有点没明白你讲的意思?
我能有什么办法阿 , 完全没办法 , 只能从裤兜里拿出笔和纸 , 快速的画了一张图 。