分布式系统中的“身份证”即分布式Id且唯一。如何生成分布式系统中的唯一Id?考虑这个问题的时候,我觉得可以从“带着问题去找方案”这个思路去聊聊,也就是说我要生成的这个分布式Id需要满足哪些条件呢?
分布式Id生成需要满足的条件全局唯一:这个不用多说了,不然还有什么分布式“身份证”?高可用:不能有单点故障,小心引起雪崩;安全:这个Id不能是连续的,否则让非友好人士发现规则,数据爬去、数据预测都会有一定的安全风险;保证顺序递增:MySQL的Innodb引擎采用B+树算法存储索引数据,为了提高性能,就得要求索引的主键在一定程度上是有序的,这样不管是写入还是查询效率都很好的;分片支持:可以根据分布式Id得到具体的业务shardingId,方便业务查询;不要太长:64位存储最佳?大家觉得还有哪些场景或者条件需要考虑?欢迎评论区留言讨论~那么基于以上需要考虑的条件,我们日常中都有哪些分布式Id生成方案呢?数据库生成优点:简单粗暴,自增Id顺序递增
缺点:只有主库才能生成,容易造成单点故障;性能不足时候,无法扩展;分库分表会有很多麻烦。
UUID优点:简单直接,无性能问题,真正的全球唯一
缺点:无规则;UUID是字符串,IO传输数据量大,存储空间大,查询效率低;基于UUID分库分表更难。
redis生成优点:基于内存操作的reids性能比数据库好;可以基于集群做有序的数字Id生成;利于分库分表;
缺点:需要搭建一套高可用redis集群;需要基于集群编写生成Id的方案;
zookeeper生成和redis类似业务规则生成举例订单号的生成:10_2298765801_1565283246399_781.业务字段用于区分具体的业务,采用2-4位,可以根据不同的系统或者业务自由决定;2.用户Id,最长10位够了吧3.毫秒级时间戳:13位4.随机数:2-4位个人还是喜欢采用业务规则生成的方案,性能肯定没的说,基于内存计算即可得到,也不存在什么单点故障,哪台机器都可以自己生成,不依赖第三方服务或者应用,也能保证顺序递增。
这样的设计能达到真正的分布式唯一Id吗?能满足上面所说的那些条件吗?大家还有什么好的生成方案?欢迎评论交流,批评指正~
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有