記一次訂單號事故
阿新 • • 發佈:2020-08-21
### 記一次訂單號事故
> 去年年底的時候,我們線上出了一次事故,這個事故的表象是這樣的:
>系統出現了兩個一模一樣的訂單號,訂單的內容卻不是不一樣的,而且系統在按照
>訂單號查詢的時候一直拋錯,也沒法正常回調,而且事情發生的不止一次,所以
>這次系統升級一定要解決掉。
經手的同事之前也改過幾次,不過效果始終不好:總會出現訂單號重複的問題,
所以趁著這次問題我好好的理了一下我同事寫的程式碼。
這裡簡要展示下當時的程式碼:
```
/**
* OD單號生成
* 訂單號生成規則:OD + yyMMddHHmmssSSS + 5位數(商戶ID3位+隨機數2位) 22位
*/
public static String getYYMMDDHHNumber(String merchId){
StringBuffer orderNo = new StringBuffer(new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()));
if(StringUtils.isNotBlank(merchId)){
if(merchId.length()>3){
orderNo.append(merchId.substring(0,3));
}else {
orderNo.append(merchId);
}
}
int orderLength = orderNo.toString().length();
String randomNum = getRandomByLength(20-orderLength);
orderNo.append(randomNum);
return orderNo.toString();
}
/** 生成指定位數的隨機數 **/
public static String getRandomByLength(int size){
if(size>8 || size<1){
return "";
}
Random ne = new Random();
StringBuffer endNumStr = new StringBuffer("1");
StringBuffer staNumStr = new StringBuffer("9");
for(int i=1;i