需求背景,系統之前的訂單號是用毫秒時間戳作為訂單號。
並發量大時會出現很多重復的訂單號,因為需要改造。
改造的要求是仍使用13位純數字,支持線上三台機器最大1000TPS並發訪問量。
以下是改造代碼
static class Generator13{
public final static String machineCode13 = "0";
private final static AtomicInteger sub = new AtomicInteger(0);
public static String make(){
StringBuffer sb = new StringBuffer();
sb.append(machineCode13);
long timestamp = System.currentTimeMillis()/1000;
sb.append((timestamp+"").substring(1));
int subValue = sub.incrementAndGet();
if(subValue > 999){
sub.getAndSet(0);
return make();
}
if(subValue<10){
sb.append("00");
} else if(subValue<100){
sb.append("0");
}
sb.append(subValue);
return sb.toString();
}
}
這段訂單生成代碼支持
單台最大TPS1000,
最大10台機器並發,
3.17年內無重復訂單號
在有十台機器的情況下,能滿足最大10000 TPS。
遠遠超出了現有的並發量
缺點
單台最大1000TPS,如果某個瞬間超出1000TPS,就必定會有重復訂單號存在。
因為訂單號第一位作為機器碼,有泄露非業務信息的情況,但同時也方便了查詢日志。