`

记录开源雪花算法文档

    博客分类:
  • Java
阅读更多
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-project-leaf.html
tinyid  https://github.com/didi/tinyid/wiki
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,不依赖任何其他组件 https://www.jianshu.com/p/98c202f64652?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin
2.美团 leaf-snowflake 开源组件 依赖zk组件,有监控

分享一线互联网大厂分布式唯一ID设计 之 snowflake方案https://www.toutiao.com/i6687758757885116941/

userid
redis方案

漫画解读snowflake https://blog.csdn.net/weixin_41235296/article/details/86649849

留此记录
我司引入的是百度uid,我详细分析了例子中的1W4怎么算出来的、我也提了个问题问作者大家可以看下 https://github.com/baidu/uid-generator/issues/36
例如节点采取用完即弃的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代码如下
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
https://github.com/lyg123/uid-generator-spring-boot-starter
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics