欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记录开源雪花算法文档

程序员文章站 2022-07-21 17:45:10
UidGenerator:readme https://github.com/lyg123/uid-generator/blob/master/README.zh_cn.md leaf readme https://tech.meituan.com/2019/03/07/open-source-pr ......

uidgenerator:readme  https://github.com/lyg123/uid-generator/blob/master/readme.zh_cn.md 
leaf readme    
tinyid   
tinyid是用java开发的一款分布式id生成系统,基于数据库号段算法实现,关于这个算法可以参考美团leaf或者tinyid原理介绍。tinyid扩展了leaf-segment算法,支持了多db(master),同时提供了java-client(sdk)使id生成本地化,获得了更好的性能与可用性。tinyid在滴滴客服部门使用,均通过tinyid-client方式接入,每天生成亿级别的id。 

uidgenerator:百度开源的分布式id服务(解决了时钟回拨问题)分析 
https://mp.weixin.qq.com/s?__biz=mzu5oduwnzy1nw==&mid=100000822&idx=1&sn=fa522bf140585252a61b177e82296271&chksm=7e426dd04935e4c6fc76a38391b51571e4aed27b0f49e4bb448f28bca495595bb949a0e08295&xtrack=1&scene=0&subscene=10000&clicktime=1559118090&ascene=7&devicetype=android-28&version=2700043b&nettype=ctnet&abtest_cookie=baabaaoacwasabmabgajlx4avpkeam%2bzhgdcmr4a%2bzkeaaoahgaaaa%3d%3d&lang=zh_cn&pass_ticket=di0xs6on2ufyuhb6fsljfzwukrsqic7xybkotguohsl0%2fnyp3kmwngnbcmeyfy1y&wx_header=1
场景:订单id 

分布式id生成器介绍 里面有介绍雪花算法和它的位数怎么设置 
https://mp.weixin.qq.com/s/qo84jwhq5o2mpafshrh2ba 

时间回拨问题解决方案 
1.备份workid,不依赖任何其他组件  
2.美团 leaf-snowflake 开源组件 依赖zk组件,有监控 

分享一线互联网大厂分布式唯一id设计 之 snowflake方案

userid 
redis方案 

漫画解读snowflake  

留此记录 
我司引入的是百度uid,我详细分析了例子中的1w4怎么算出来的、我也提了个问题问作者大家可以看下  
例如节点采取用完即弃的workeridassigner策略, 重启频率为12次/天, 那么配置成{"workerbits":23,"timebits":31,"seqbits":9}时, 可支持28个节点以整体并发量14400 uid/s的速度持续运行68年. 时间 2的31次方-1 / 86400 / 365 = 68年 

序号 2的9次方 = 512 

workid数 2的23次方 = 8388608 

重启次数 68 乘上 365 乘上 12 天 = 297840 

应用数 节点 除以 重启次数 = 8388608 / 297840 = 28 

并发 28 乘上 512 = 14336 
另一个例子 

workid 30位 = 1073741824 (2位随机数+后两段ip) 

time 29位 为17年 

seq 4位 为16 

重启次数 17 * 365 * 12 = 950460 

应用 = workid数 / 重启数 = 1129 

并发 1128 * 16 = 1w8 

应用重启的时候时间回拨+随机数一样,概率很低 

2位随机数+后两段ip代码如下 

java代码  
  1. import com.baidu.fsg.uid.worker.workeridassigner;  
    import org.apache.commons.lang.stringutils;  
      
    import java.util.random;  
      
    public class iprandomworkidassigner implements workeridassigner {  
      
        private static final random random = new random();  
        private static final int[] random = new int[90];  
      
        public iprandomworkidassigner() {  
            for (int i = 10; i < 100; i++) {  
                random[i - 10] = i;  
            }  
        }  
      
        @override  
        public long assignworkerid() {  
            string ip = netutils.getlocaladdress();  
            string[] ips = ip.split("\\.");  
            stringbuilder sb = new stringbuilder();  
            sb.append(random[random.nextint(90)]).append(stringutils.leftpad(ips[2], 3, '0'))  
                    .append(stringutils.leftpad(ips[3], 3, '0'));  
            return long.parselong(sb.tostring());  
        }  
      
    }  

     


这里介绍下自己写的uid-spring-boot-starter