适用于分布式唯一标识码的生成算法有哪些?
谢邀~
关于这个问题,有几个方案和大家分享一下。
利用数据库生成先说最笨的方法,利用数据库的自增长序列生成,数据库内唯一。
优点:理解起来最容易,用起来也最容易。
缺点:也非常明显了,每种数据库的实现不同,如果数据库需要迁移的话比较麻烦;最大的问题是性能问题,不太好扩展,如果并发大的时候,数据库很可能扛不住。
利用Redis/MongoDB/zookeeper生成Redis的单线程的,利用incr和increby;MongoDB的ObjectId;ZK通过znode数据版本;都可以生成全局的唯一标识码。
优点:性能高于数据库;可以使用集群部署。
缺点:需要引入对应的组件,增加系统的复杂度。
UUID这个是分布式架构中,生成唯一标识码最常用的算法。
UUID有基于MAC地址的,加上时间和时钟序列的,也有基于伪随机数的,基于加密哈希的。
优点:本地生成,不需要第三方组件,生成比较简单,性能好。
缺点:长度长,不利于存储,并且没有排序,是个字符串,不利于查询。解决无序问题,可参考Comb算法(combined guid/timestamp)。
SnowflakeTwitter开源,基于zk,41位时间戳(毫秒数)+10位机器的ID+12位毫秒内的流水号+1位符号位(永远是0)。
优点:性能不错,单机内递增。
缺点:依赖zk;依赖于机器时钟,分布式环境内可能会不是全局递增。
UidGenerator百度开源,基于snowflake算法。
Leaf美团开源。
优点:能保证全局唯一性、高可用、趋势递增(不太安全,比如泄露公司订单数量)、单调递增等。
缺点:依然会依赖第三方组件,zk或数据库。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有