圖解支付系統(tǒng)訂單號(hào)設(shè)計(jì)與最佳實(shí)踐

0 評(píng)論 1034 瀏覽 0 收藏 9 分鐘

本文主要講清楚支付系統(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)要流程如下:

  1. DB初始化序列號(hào)數(shù)據(jù)。KEY為業(yè)務(wù)類(lèi)型,VALUE初始為0;
  2. 調(diào)用業(yè)務(wù)ID生成組件。核心傳參:數(shù)據(jù)版本號(hào),系統(tǒng)版本號(hào),系統(tǒng)名,業(yè)務(wù)類(lèi)型等。
  3. 業(yè)務(wù)ID生成組件查看對(duì)應(yīng)業(yè)務(wù)類(lèi)型是否有緩存數(shù)據(jù)。如果沒(méi)有,就以指定步長(zhǎng)(比如100)去更新數(shù)據(jù)庫(kù),然后緩存起來(lái)。
  4. 在內(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é)議。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!