在大流量下,直播app原始碼中訂單號的生成方式

雲豹科技程式設計師發表於2021-12-28

流量不大的情況下,訂單號生成

在直播app原始碼開發時,我們可以利用DB生成唯一ID的方式來實現訂單號的生成。只不過拿到ID後,根據直播app原始碼的訂單業務,簡單加個字首而已。
@Service
public class KeyGen{
   @Autowired
   private KeyGenRepository keyGenRepository;
   public long genNo(){
   KeyGen keyGen = new KeyGen();
   keyGenRepository.genarateNo(keyGen );
   //這個就是我們需要的no
   long no = keyGen.getNo();
   }
}

private String generateOrderNo() {
        StringBuffer sbf=new StringBuffer();
        //字首
        sbf.append("100");
        long no = keyGen.genNo();
        sbf.append(no);
        return sbf.toString();
	}
這種方式在直播app原始碼開發中用了一段時間,沒發現有訂單號重複的情況。這種解決方案算是一個基礎的思路,再複雜的訂單生成規則,如果訂單號要包含一個唯一的屬性,利用資料庫的自增特性是個不錯的方案。

大流量下訂單號的生成

如果直播app原始碼每個小時的訂單量非常大,比如說,一個小時有兩百萬個訂單,只用單獨一個key_gen表是支援不住的,畢竟寫入的壓力太大了,影響訂單號的生成速度。這個時候可以考慮針對訂單號的生成,搞單獨的庫,並分庫,降低insert的壓力,提高生成訂單號的速度。
分庫的規則
有一種做法是根據倉庫來對映,比如說,一家電商公司的倉庫總共有50個,那麼可以進行如下的對映:
warehouse1:資料庫0
warehouse2:資料庫0
warehouse3:資料庫1
warehouse4:資料庫1
warehouse5:資料庫2
warehouse6:資料庫2
warehouse7:資料庫3
warehouse8:資料庫3
warehouse9:資料庫3
warehouse10:資料庫4
。。。。。。
。。。。。。
warehouse50:資料庫9
將50個倉庫對映到【0-9】對應的直播app原始碼資料庫上,當下單的時候,如果訂單對應的倉庫的是warehouse1,則對映到資料庫0,對應的倉庫如果是warehouse10,則對應的資料庫4。這樣子,訂單號的生成的壓力便分配到10個資料庫上了。
進行分庫後,每個分庫裡都有一張key_gen表。
組裝訂單號
上面的分庫分表,目的是為了生成一個唯一的ID,這個ID是訂單號的一部分,生成ID藉助了資料庫,但是後面組裝訂單號則完全是業務邏輯操作,無需利用資料庫了。
直播app原始碼中訂單號的生成規則各個公司都有自己的要求,舉個例子:
時間 + 6位隨機數 + 資料庫生成的唯一ID+倉庫標識
時間的生成可以簡單的使用如下程式碼生成:
SimpleDateFormat formatShort = new SimpleDateFormat("yyMMdd");
Date now = new Date();
String currentDate = formatShort.format(now);
六位的隨機數可以藉助JAVA的AtomicLong來實現,可以應付併發。
到此訂單號完整的生成了。那有沒有坑呢?因為直播app原始碼進行了分庫,每個庫都有key_gen,生成的ID只是庫內的唯一,多個庫則是未必的。比如說,兩個訂單建立的請求,倉庫分別是warehouse1和warehouse3,根據上面的配置規則,分別路由到了資料庫0和資料庫1這兩個庫,這個時候,就可能產生相同的ID。但是不要忘記,訂單號的生成是包含倉庫標識的,一個1,一個是3,是不同的,另外還有隨機數,所以訂單號重複的機會基本不太可能的。
提供批量生成訂單號的介面
尤其是將直播app原始碼生成訂單號定義為一個微服務介面的,一定要提供批量生成訂單號的介面,在流量很大的情況下,每獲取一個訂單號就要走一次網路呼叫,開銷實在太大了。那麼一次要生成多少個才合適呢,這個根據自己的業務情況,一般情況下20-50個是夠用的。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理 原文連結:https://blog.csdn.net/linsongbin1/article/details/79467229


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2849760/,如需轉載,請註明出處,否則將追究法律責任。

相關文章