遇到了几个需要生产唯一键的场景
1:仓储系统,库内各类单号需要唯一并带有一定的业务意义
要求:AAAA20151212000000001 AAAA为舱内业务编码,中间8位为对应的年月日,后8位为唯一键保障。
2:电商订单系统,订单号需要唯一
要求:28710080047686 后四位为买家Id(for分库分表),前面数据为唯一键保障位。
3:聊天app系统注册用户Id与评论Id唯一键需求。
要求:etx32s 用户Id唯一值
三个需求中,都要求有一个能保障序列号唯一的键值。分布式系统中,保障键值唯一的方案较多。比如:简单粗暴的DB自增序列,MD5(基本唯一),以及在场景一中,当时用的tair(阿里中间件)做的分布式锁保障自增唯一。本次介绍一个sequence生成中间件产品的设计方案。
整体方案:
ps:
整体方案思路:
应用集群每次获取一个id端,本地缓存。每次使用时,本地获取。当本地id段使用完之后,再进行一次远程调用,更新。
服务端,DB做主从配置,采用MHA异常主从切换。
容量分析:
集群10wqps,500台服务器。单机id段设置1w长度,对服务器端的请求压力不到1qps,服务端无压力,且绝大部分为本地获取,无rpc消耗。
example:
1:客户端初始化
//初始化客户端Util
public static IdGenerator instance(String... password) {
IdGenerator ig = generators.get(key);
if (ig == null) {
synchronized(generators) {
ig = generators.get(key);
if (ig == null) {
ig = new IdRangeIncrementGenerator(tmpPassword, idRangeDispatcher);
generators.putIfAbsent(key, ig);
}
}
}
return ig;
}
//初始化客户端序列化段与本地Queue
public IdRangeIncrementGenerator(final String schema, final String table, final String password,
IdRangeDispatcher dispatcher) throws NoSuchGeneratorException {
super(dispatcher);
checkArgument(isNotBlank(password), "The password is blank");
this.password = password;
//异步获取idRange
backThread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
IdRange idRange = retryNext(password);//调用服务端、走DB获取Id端
backQueue.put(new IdRangeRound(idRange));
} catch (InterruptedException ie) {
logger.error("interrupted.");
Thread.currentThread().interrupt();
break;
} catch (Throwable e) {
logger.error("backThread retryNext() error", e);
}
}
}
});
backThread.setName("Raptor-IdGenerator-backThread");
backThread.setDaemon(true);
backThread.start();
IdRangeRound idRange = reload(idRangeRound);
String msg = "Can't get idRange by password[" + password + "]";
checkNotNull(idRange, msg);
}
2 客户端获取Id段使用
//直接本地方法获取
@Override
public long next(int num) throws NoMoreIdException {
checkArgument(num > 0, "The num[" + num + "] must be > 0 ");
long[] ids = new long[num];
for (int i = 0; i < num; i++) {
long id;
IdRangeRound ir = idRangeRound;
while ((id = ir.next(1)) == -1) {
//当本地id段不够使用时,重新远程获取更新id段
ir = reload(ir);
}
ids[i] = id;
}
return ids;
}
//阻塞线程更新,重新获取Id端
private synchronized IdRangeRound reload(IdRangeRound ir) {
if (ir != idRangeRound) {
return idRangeRound;
}
try {
return idRangeRound = backQueue.take();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
3 服务端DB容灾方案:MHA
相关推荐
其次,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的输入转化为固定长度的输出,即128位的二进制数,通常以32个十六进制字符表示。MD5的主要用途是验证数据的完整性和一致性,因为...
### MyEclipse 6.0 自动...综上所述,MyEclipse 6.0自动生成序列号的方法是一种通过编程手段实现的序列号生成方案,能够快速生成与用户相关的序列号。然而,在实际应用中,用户应遵守软件许可协议,合法使用软件资源。
在描述中提到的“vmware workstation 10 序列号生成器”是指一种工具,通常这类工具是非官方的,目的是为了生成可以激活VMware Workstation 10的序列号。然而,值得注意的是,使用这种序列号生成器是违反VMware的...
一种常见的分布式ID生成方案是雪花算法(Snowflake)。该算法由Twitter开源,通过组合时间戳、工作节点ID和序列号生成64位的长整型ID。时间戳保证了ID的生成顺序,工作节点ID确保不同节点生成的ID互不干扰,而序列号...
此外,文档中还提到了Twitter的Snowflake算法,这是一种基于时间戳、工作节点ID和序列号的分布式ID生成方案。Snowflake算法将64位的long型数值分为三部分:1位符号位,41位时间戳,10位工作节点ID和12位序列号。这种...
本文探讨了如何利用硬盘序列号生成计算机指纹,为软件加密提供了一种新的解决方案。通过对Windows环境下的中断技术进行深入研究,成功实现了硬盘序列号的读取,这对于软件开发者来说是一个有价值的参考。未来的研究...
总的来说,获取硬盘序列号是IT工作中常见的需求,而这款软件提供了面向Windows XP系统的一种简便解决方案,通过批处理文件和ActiveX控件简化了这一过程。同时,它的网页调用模式增加了其在Web环境下的应用可能性。...
Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...
UUID是一种广泛使用的标准,它能生成128位的唯一标识符。UUID基于时间戳、随机数和MAC地址等信息生成,几乎不可能重复。在Java、Python等语言中都有内置库支持生成UUID。 2. **时间戳+随机数**: 结合当前时间戳...
硬盘序列号是每个硬盘制造商为生产出的每个硬盘分配的唯一标识符,类似于设备的身份证。以下将详细解释如何使用Java来实现这一功能。 首先,我们需要了解Java不直接提供读取硬件信息的API,但可以通过第三方库或JNI...
注册机是一种程序,旨在生成假冒的序列号或注册码,使用户可以绕过软件的授权机制,非法使用未购买的软件。这种行为违反了版权法,可能导致法律问题。尽管注册机可能看似提供了便捷的解决方案,但使用它们不仅侵犯了...
总结来说,官方Java端口的Sqids是一个强大的工具,它为Java开发者提供了一种生成短而唯一ID的解决方案。通过对时间戳、序列号和工作节点ID的巧妙组合, Sqids能够在分布式环境中有效地保证ID的唯一性,同时保持较高...
经过讨论和思考后有几种解决方案,一是在数据库表层加锁,一是采用类似 redis 的消息队列,还有就是通过文件锁达到数据库排他锁的目的,鉴于时间和项目当前的情况,最后采用了通过文件锁实现这个需求。 其实除了以上...
【seqsvr】是针对大规模分布式系统中序列号生成需求的一种解决方案,常见于高并发、高可用的场景,如微信等大型互联网公司的服务中。序列号生成器在系统中起着至关重要的作用,它为每个请求分配唯一的标识,便于跟踪...
雪花算法(Snowflake Algorithm)是由Twitter开源的一种分布式ID生成方案。它的设计目标是在分布式环境中生成全局唯一的、递增的64位整数ID,主要由以下几个部分组成: 1. **时间戳**(41位):从2015年1月1日(UTC...
UUID,全称Universally ...总之,雪花算法提供了一种高效、有序的全局唯一ID生成方案,广泛应用于分布式系统,如数据库主键生成、消息队列的消息ID等。了解并掌握雪花算法,对于理解和设计分布式系统具有重要意义。
Vesta的工作原理基于Snowflake算法的变种,这是一种时间戳+机器标识+序列号的组合策略。它的ID由以下几个部分组成: 1. **时间戳**:Vesta使用毫秒级的时间戳作为ID的一部分,确保了ID的生成是按照时间顺序进行的。...
另外,UUID(Universally Unique Identifier)也是一种常用的方案,它通过算法生成一个128位的数字,几乎可以保证全球范围内的唯一性。然而,UUID的长度较长,可能对存储和传输效率有影响。 除了以上提到的方法,...
在这里提到的"序列号算号器"可能是指一种工具,可以生成或匹配黑群晖设备的序列号。通常,黑群晖的序列号是设备的唯一标识,用于验证产品的合法性。"算号器"可能允许用户自定义或解密序列号,以便在未授权的情况下...
关于标签,“雪花算法”是这个生成器的技术基础,它是分布式系统中解决ID生成问题的一种高效解决方案。“ID生成器”和“UID生成器”是同义词,强调了这个工具的主要功能。“唯一ID生成器”则进一步明确了这个工具...