圖解支付系統(tǒng)訂單號(hào)設(shè)計(jì)與最佳實(shí)踐
本文主要講清楚支付系統(tǒng)訂單號(hào)(或業(yè)務(wù)ID)各種設(shè)計(jì)方案對(duì)比,各子域的訂單號(hào)(或業(yè)務(wù)ID)為什么要統(tǒng)一規(guī)范,以及最佳實(shí)踐。最后還會(huì)簡(jiǎn)單分析微信支付和支付寶的對(duì)客訂單號(hào)的組成差異。
本文主要講清楚支付系統(tǒng)訂單號(hào)(或業(yè)務(wù)ID)各種設(shè)計(jì)方案對(duì)比,各子域的訂單號(hào)(或業(yè)務(wù)ID)為什么要統(tǒng)一規(guī)范,以及最佳實(shí)踐。最后還會(huì)簡(jiǎn)單分析微信支付和支付寶的對(duì)客訂單號(hào)的組成差異。
假如你也好奇為什么有了數(shù)據(jù)庫(kù)自增ID外還需要業(yè)務(wù)ID,或者想了解如何在業(yè)務(wù)ID中編織進(jìn)業(yè)務(wù)信息比如業(yè)務(wù)系統(tǒng),數(shù)據(jù)版本,分庫(kù)分表位等,值得花幾分鐘了解一下。
同時(shí)我也不建議在支付系統(tǒng)中使用雪花算法來(lái)生成業(yè)務(wù)ID。
訂單號(hào)和業(yè)務(wù)ID本質(zhì)都是標(biāo)識(shí)一筆交易,以下統(tǒng)稱為:業(yè)務(wù)ID。
一、什么是業(yè)務(wù)ID
數(shù)據(jù)庫(kù)一般都會(huì)設(shè)計(jì)一個(gè)自增ID做為主鍵,同時(shí)還會(huì)設(shè)計(jì)一個(gè)能唯一標(biāo)識(shí)一筆業(yè)務(wù)的ID,這就是所謂的業(yè)務(wù)ID(也稱業(yè)務(wù)鍵)。比如收單域有收單單號(hào),支付域有支付號(hào),渠道網(wǎng)關(guān)域有渠道支付號(hào)等,這些都屬于業(yè)務(wù)ID。
為什么有了自增ID后,還需要有業(yè)務(wù)ID呢?一般來(lái)說(shuō)有以下幾個(gè)核心原因:
- 分庫(kù)分表的強(qiáng)訴求。一旦分庫(kù)分表,各表之間的自增ID就一定會(huì)重復(fù)。
- 全球化部署的強(qiáng)訴求。在跨境支付系統(tǒng)建設(shè)時(shí),部分國(guó)家地區(qū)要求本地化部署,需要通過(guò)業(yè)務(wù)ID知道業(yè)務(wù)運(yùn)行在哪個(gè)機(jī)房。
- 標(biāo)識(shí)業(yè)務(wù)語(yǔ)義,在處理故障時(shí)能快速定位是哪個(gè)域哪個(gè)業(yè)務(wù)。
- 方便系統(tǒng)升級(jí)。通過(guò)業(yè)務(wù)ID的版本所在位判斷業(yè)務(wù)應(yīng)該走新系統(tǒng),還是走老系統(tǒng)。
二、為什么業(yè)務(wù)ID要統(tǒng)一規(guī)范
互聯(lián)網(wǎng)支付系統(tǒng)基本都是微服務(wù)化部署,每個(gè)子域都是相對(duì)獨(dú)立的一些同學(xué)在研發(fā),架構(gòu)實(shí)現(xiàn)差異非常大,但是業(yè)務(wù)ID是必須要統(tǒng)一的。主要有以下幾個(gè)原因:
減少維護(hù)成本。避免在不同服務(wù)中重復(fù)發(fā)明相似機(jī)制,也減少了溝通成本。方便做成統(tǒng)一的組件。
加速異常處理和診斷。在分布式環(huán)境下發(fā)現(xiàn)和解決問(wèn)題一般都比較復(fù)雜,統(tǒng)一的業(yè)務(wù)ID規(guī)范可以快速判斷問(wèn)題所在的域,以及對(duì)應(yīng)的業(yè)務(wù)。
避免新同學(xué)因經(jīng)驗(yàn)不足導(dǎo)致設(shè)計(jì)缺陷,在后期無(wú)法滿足業(yè)務(wù)訴求。
三、常見(jiàn)業(yè)務(wù)ID生成規(guī)范及應(yīng)用場(chǎng)景
業(yè)務(wù)ID生成規(guī)則有很多種,比如知名的Snowflake算法,UUID算法,時(shí)間戳+隨機(jī)數(shù)/序列號(hào)等。以下是部分規(guī)范的簡(jiǎn)要介紹。
Snowflake算法
組成:時(shí)間戳 + 數(shù)據(jù)中心標(biāo)識(shí) + 機(jī)器節(jié)點(diǎn) + 序列號(hào)。
適用場(chǎng)景:無(wú)中心化的環(huán)境中生成大量的唯一ID,無(wú)具體業(yè)務(wù)語(yǔ)義,且性能要求極高。比如社交媒體的聊天消息記錄。
UUID算法
高度唯一且隨機(jī)。
適用場(chǎng)景:不想讓外界感知內(nèi)部系統(tǒng)的交易量級(jí)。比如調(diào)用外部渠道的請(qǐng)求號(hào),如果使用序列號(hào),有可能會(huì)讓外部猜測(cè)出交易的規(guī)模。
編碼系統(tǒng)
特定組織中心化生成。
適用場(chǎng)景:藥品或供應(yīng)鏈管理,全球范圍內(nèi)標(biāo)識(shí)或追蹤商品。
業(yè)務(wù)規(guī)則編碼
把一些業(yè)務(wù)語(yǔ)義編碼到ID中。
適用場(chǎng)景:金融支付、電商訂單等。
四、支付系統(tǒng)業(yè)務(wù)ID生成最佳實(shí)踐
4.1. 業(yè)務(wù)ID生成規(guī)范
下面以32位的支付系統(tǒng)業(yè)務(wù)ID生成為例說(shuō)明。實(shí)際應(yīng)用時(shí)可靈活調(diào)整。
第1-8位:日期。通過(guò)單號(hào)一眼能看出是哪天的交易。
第9位:數(shù)據(jù)版本。用于單據(jù)號(hào)的升級(jí)。
第10位:系統(tǒng)版本。用于內(nèi)部系統(tǒng)版本升級(jí),尤其是不兼容升級(jí)的時(shí)候,老業(yè)務(wù)使用老的系統(tǒng)處理,新業(yè)務(wù)使用新系統(tǒng)處理。
第11-13位:系統(tǒng)標(biāo)識(shí)碼。支付系統(tǒng)內(nèi)部每個(gè)域分配一段,由各域自行再分配給內(nèi)部系統(tǒng)。比如010是收單核心,012是結(jié)算核心。
第14-15位:業(yè)務(wù)標(biāo)識(shí)位。由各域內(nèi)部定,比如00-15代表支付類(lèi)業(yè)務(wù),01支付,02預(yù)授權(quán),03請(qǐng)款等。
第16-17位:機(jī)房位。用于全球化部署。
第18-19位:用戶分庫(kù)位。支持百庫(kù)。
第20-21位:用戶分表位。支持百表。
第22位:預(yù)發(fā)生產(chǎn)標(biāo)識(shí)位。比如0代表預(yù)發(fā)環(huán)境,1代表生產(chǎn)環(huán)境。
第23-24位:預(yù)留。各域根據(jù)實(shí)際情況擴(kuò)展使用。
第24-32位:序列號(hào)空間。一億規(guī)模,循環(huán)使用。一個(gè)機(jī)房一天一億筆是很大的規(guī)模了。如果不夠用,可以擴(kuò)展到第24位,到十億規(guī)模。4.2. 業(yè)務(wù)ID生成技術(shù)實(shí)現(xiàn)
序列號(hào)通常采用數(shù)據(jù)庫(kù)生成,保證機(jī)房?jī)?nèi)唯一性。
簡(jiǎn)要流程如下:
- DB初始化序列號(hào)數(shù)據(jù)。KEY為業(yè)務(wù)類(lèi)型,VALUE初始為0;
- 調(diào)用業(yè)務(wù)ID生成組件。核心傳參:數(shù)據(jù)版本號(hào),系統(tǒng)版本號(hào),系統(tǒng)名,業(yè)務(wù)類(lèi)型等。
- 業(yè)務(wù)ID生成組件查看對(duì)應(yīng)業(yè)務(wù)類(lèi)型是否有緩存數(shù)據(jù)。如果沒(méi)有,就以指定步長(zhǎng)(比如100)去更新數(shù)據(jù)庫(kù),然后緩存起來(lái)。
- 在內(nèi)存中加一,然后根據(jù)規(guī)則生成業(yè)務(wù)ID,返回給調(diào)用方。
這里使用指定步長(zhǎng)去更新數(shù)據(jù)庫(kù),主要是考慮提高性能。但是存在一定的損失,比如發(fā)布重啟,緩存中的序列號(hào)就會(huì)被浪費(fèi)掉。但因?yàn)槭茄h(huán)使用,所以基本上對(duì)業(yè)務(wù)沒(méi)有影響。
五、內(nèi)外區(qū)分
建議把內(nèi)部訂單號(hào)和外部訂單號(hào)做個(gè)區(qū)分。所謂外部訂單號(hào)主要指對(duì)客(包括個(gè)人用戶和商戶)的訂單號(hào),這種場(chǎng)景下,可以考慮把業(yè)務(wù)類(lèi)型做為重點(diǎn)編織進(jìn)到訂單號(hào)里面。
具體可以參考下面聊到的微信支付和支付寶對(duì)客訂單號(hào)。
6.?微信支付和支付寶對(duì)客訂單號(hào)的異同
微信支付:
有興趣的可以翻翻自己微信支付的訂單記錄,42000開(kāi)頭的是支付類(lèi)的訂單,1000050001開(kāi)頭是轉(zhuǎn)賬類(lèi)訂單,也就是微信支付把交易類(lèi)型放在訂單的開(kāi)頭。
日期則放在交易類(lèi)型的后面。
支付寶:
也可以翻翻自己支付寶的訂單記錄,日期放在開(kāi)頭,緊接著日期的就是交易類(lèi)型,2000代表轉(zhuǎn)賬,比如202501012000xxxx。而2300或2200就是買(mǎi)東西的支付訂單。
七、結(jié)束語(yǔ)
本文主要講了業(yè)務(wù)ID是什么,業(yè)界常見(jiàn)生成規(guī)則及適用場(chǎng)景,以及支付系統(tǒng)業(yè)務(wù)ID生成的最佳實(shí)踐。
本文由人人都是產(chǎn)品經(jīng)理作者【隱墨星辰】,微信公眾號(hào):【隱墨星辰】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來(lái)自Unsplash,基于 CC0 協(xié)議。
- 目前還沒(méi)評(píng)論,等你發(fā)揮!