概述 訂單系統(tǒng)作為電商系統(tǒng)的“紐帶”貫穿了整個電商系統(tǒng)的關(guān)鍵流程。其他模塊都是圍繞訂單系統(tǒng)進行構(gòu)建的,。訂單系統(tǒng)的演變也是隨著電商平臺的業(yè)務(wù)變化而逐漸演變進化著,,接下來就和大家一起來解析電商平臺的“生命紐帶”。 上帝視角訂單系統(tǒng) 訂單系統(tǒng)的作用是:管理訂單類型,、訂單狀態(tài),,收集關(guān)于商品,、優(yōu)惠、用戶,、收貨信息、支付信息等一系列的訂單實時數(shù)據(jù),,進行庫存更新、訂單下發(fā)等一系列動作,。訂單系統(tǒng)業(yè)務(wù)的基本模型涉及用戶,、商品(庫存)、訂單,、付款,,訂單基本流程是下訂單——>減庫存,,這兩步必須同時完成,,不能下了訂單不減庫存(超賣),或者減了庫存沒有生成訂單(少賣),。超賣商家?guī)齑娌蛔悖M者下了單買不到東西,,體驗不好;少賣商家?guī)齑娣e壓或者需要反復修改商品信息,反復麻煩,,體驗也不好,。 02 訂單基本概念 設(shè)計訂單系統(tǒng)時包含幾個大的方向需要考慮,這些內(nèi)容決定了訂單系統(tǒng)的穩(wěn)定性和可持續(xù)性。 訂單的多樣性特點 主要由來源和操作的多樣導致了訂單多樣性點,。 訂單字段 訂單字段包含了訂單中需要記錄的信息,,他的作用主要用于溝通其他系統(tǒng),為下游系統(tǒng)提供信息依據(jù),。 訂單信息 訂單號作為訂單識別的標識,,一般按照某種特定規(guī)則生成,,根據(jù)訂單的增加進行自增,同時在設(shè)計訂單號的時候考慮訂單無序設(shè)置(防止競爭者或者第三方來估算訂單量),。訂單號后續(xù)用作訂單唯一標示用于對接WMS(倉存管理系統(tǒng))和TMS(運輸管理系統(tǒng))時的訂單識別,。 訂單狀態(tài) 訂單狀態(tài)在下面章節(jié)會詳細描述 用戶信息 指買家的相關(guān)信息,包括名稱,、地址,、手機號。O2O還會多一種情況就是自提點,這樣地址則會變?yōu)樽蕴狳c的地址,。地址信息在后續(xù)會作用在WMS和TMS上用于區(qū)分區(qū)域和配送安排,。 商品信息 商品的基本信息和庫存,金額由于比較特殊所以我把金額獨立在商品信息以外說,,不過邏輯上其實都屬于商品信息范疇,。商品信息主要影響庫存更新和WMS產(chǎn)生。 金額信息 訂單產(chǎn)生的商品信息,,這里面除了要記錄最終的金額,,過程金額也需要記錄。比如商品分攤的優(yōu)惠金額,、支付金額,,應(yīng)付金額等。在后續(xù)的訂單結(jié)算,、退換貨,、財務(wù)等環(huán)節(jié)都需要使用。 時間信息 記錄訂單每個狀態(tài)節(jié)點的觸發(fā)時間,。 03 訂單流程 訂單流程是指整個訂單從產(chǎn)生到完成整個流轉(zhuǎn)過程,,包括了正向和逆向流程的過程。 正向流程 這里面主要是涉及主流電商系統(tǒng)中的通用訂單流程,,部分細節(jié)可以根據(jù)自己平臺的特殊性進行調(diào)整,。 需要注意的地方
逆向流程 逆向流程指訂單發(fā)生取消,、退貨等情況時引發(fā)的訂單流程過程。 觸發(fā)逆向流程的觸發(fā)主要有幾種情況:
關(guān)注點
訂單狀態(tài) 從訂單狀態(tài)設(shè)計目的和存在價值去分析和理解它背后設(shè)計機制:維度及維度顆粒度大小。 1. 正向和逆向流程維度
2.服務(wù)對象維度
訂單推送 當狀態(tài)發(fā)生變化時,,需要將對應(yīng)的變化情況告知給相關(guān)人員以便了解當前訂單的情況,,這就是訂單推送的作用。 訂單推送的觸發(fā)依賴于狀態(tài)機的變化,,涉及到的信息包括
04 訂單系統(tǒng)設(shè)計的挑戰(zhàn)和實踐 訂單系統(tǒng)需求演變 第一步:實現(xiàn)購買流程 1.實現(xiàn)訂單的創(chuàng)建、發(fā)貨,、確認等信息閉環(huán) 2.支持訂單審核(初期可支持人工審核即可) 3.支持用戶端顯示訂單相關(guān)信息 4.支持促銷金額的計算 第二步:提供服務(wù) 1.提供訂單分布式服務(wù) 2.支持跨平臺交易單生成(即同一個大交易單內(nèi)既有商家商品又有自營商品或者是多個商家的商品) 3.支持拆單,、合并邏輯(配送單、支付單等) 4.提供更豐富的訂單推送服務(wù),,完善訂單狀態(tài) 第三步:支持不同營銷手段下的訂單類型 平臺發(fā)展到足夠大的規(guī)模,,提效、穩(wěn)定變成一個重要的話題,??梢蕴峁┎煌瑺I銷場景下的訂單,如:團購,、預購等,。 訂單系統(tǒng)架構(gòu)的演變 第一代:簡單粗暴 第一代的問題 第一代系統(tǒng)由于,,訂單狀態(tài)是在特定的服務(wù)器進行處理,如果服務(wù)一旦出現(xiàn)問題就會造成訂單的丟失,,導致訂單流程無法進行下去,。 總結(jié): 1、服務(wù)單點 2,、數(shù)據(jù)庫單點 第二代:無狀態(tài)異步驅(qū)動 第二代系統(tǒng)對于第一代有了很好的提升,,應(yīng)用服務(wù)器不再保留訂單狀態(tài),但是這樣的系統(tǒng)設(shè)計同時也給數(shù)據(jù)庫服務(wù)器造成了高頻查詢帶來的壓力,,導致數(shù)據(jù)庫相對比較脆弱,。 總結(jié): 狀態(tài)掃描帶來的負載 第三代:隊列模式 第三代是對于第二代的升級,訂單的狀態(tài)流轉(zhuǎn)不再依靠高頻查詢數(shù)據(jù)庫來獲得,,通過隊列模式,,很好減輕了數(shù)據(jù)庫的壓力,但是第三代依然有問題,,就是該系統(tǒng)中server2成了核心,,該模塊的維護就會變得很復雜,這也是架構(gòu)設(shè)計的關(guān)鍵,,沒有完全的完美架構(gòu),,只能得到一個平衡架構(gòu)。 三代系統(tǒng)演變中的最佳實踐 實踐1: 重試和補償
實踐2: 冪等性
實踐3: 一致性實踐
實踐4: 工作流 (Workflow)
無狀態(tài)的Worker,,分布式部署,分布式存儲 工作流狀態(tài)
定時器,、重試,、冪等性、強一致性的狀態(tài)
工作流的描述和執(zhí)行Activity描述相分離, 支持異步觸發(fā)
系統(tǒng)優(yōu)化 數(shù)據(jù)庫讀寫分離 基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性查詢,,而從數(shù)據(jù)庫處理SELECT查詢,。數(shù)據(jù)庫復制被用來把事務(wù)性查詢導致的變更同步到集群中的從數(shù)據(jù)庫。 當然,,主服務(wù)器也可以提供查詢服務(wù),。使用讀寫分離最大的作用無非是環(huán)境服務(wù)器壓力。 好處
讀寫分離提高性能之原因
實現(xiàn)方案 數(shù)據(jù)庫分庫分表 不管是采用何種分庫分表框架或者平臺,其核心的思路都是將原本保存在單表中太大的數(shù)據(jù)進行拆分,,將這些數(shù)據(jù)分散保存到多個數(shù)據(jù)庫的多個表中,,避免因為單表數(shù)據(jù)量太大給數(shù)據(jù)的訪問帶來讀寫性能的問題。所以在分庫分表場景下,,最重要的一個原則就是被拆分的數(shù)據(jù)盡可能的平均拆分到后端的數(shù)據(jù)庫中,,如果拆分的不均勻,還會產(chǎn)生數(shù)據(jù)訪問熱點,,同樣存在熱點數(shù)據(jù)因為增長過快而又面臨數(shù)據(jù)單表數(shù)據(jù)量過大的問題,。 而對于數(shù)據(jù)以什么樣的緯度進行拆分,大家看到很多場景中都是對業(yè)務(wù)數(shù)據(jù)的ID(大部分場景此ID是以自增長的方式)進行HASH取模的方式將數(shù)據(jù)進行平均拆分,,這個簡單的方式確實在很多場景下都是非常合適的拆分方法,,但并不是在所有的場景中這樣拆分的方式都是最優(yōu)的選擇。也就是說數(shù)據(jù)如何拆分并沒有所謂的金科玉律,,更多的是需要結(jié)合業(yè)務(wù)數(shù)據(jù)的結(jié)構(gòu)和業(yè)務(wù)場景來決定,。 下面以大家最熟悉的電商訂單數(shù)據(jù)拆分為例,訂單是任何一個電商平臺都有的業(yè)務(wù)數(shù)據(jù),,每個平臺用戶提交訂單都會在平臺后端生成訂單相關(guān)的數(shù)據(jù),,一般記錄一條訂單數(shù)據(jù)的數(shù)據(jù)庫表結(jié)構(gòu)如下: 訂單數(shù)據(jù)主要由三張數(shù)據(jù)庫表組成,主訂單表對應(yīng)的就是用戶的一個訂單,,每提交一次都會生成一條主訂單表的數(shù)據(jù),。在有些情況下,用戶可能在一個訂單中選擇不同賣家的商品,,而每個賣家又會按照該訂單中自己提供的商品計算相關(guān)的商品優(yōu)惠(如滿100元減10元)以及按照不同的收貨地址設(shè)置不同的物流配送,,所以會出現(xiàn)子訂單的相關(guān)概念,即一個主訂單會由多個子訂單組成,,而真正對應(yīng)到具體每個商品訂單信息,,則保存在訂單詳情表中。 如果一個電商平臺的業(yè)務(wù)發(fā)展健康的話,,訂單數(shù)據(jù)是比較容易出現(xiàn)因為單個數(shù)據(jù)庫表中的數(shù)據(jù)量過大而造成性能的瓶頸,,所以需要對他進行數(shù)據(jù)庫的拆分。此時從理論上對訂單拆分是可以由兩個緯度進行的,,一個緯度是通過訂單ID(一般為自增長ID)取模的方式,,即以訂單ID為分庫分表鍵;一個是通過買家用戶ID的緯度進行哈希取模,即以買家用戶ID為分庫分表鍵,。 兩種方案做一下對比: 1,、如果是按照訂單ID取模的方式,比如按1024取模,,則可以保證主訂單以及相關(guān)子訂單,,訂單詳情數(shù)據(jù)平均落入到后端1024個數(shù)據(jù)庫表中,,原則上很好地滿足了數(shù)據(jù)盡可能平均拆分的原則,。 2、通過采用買家ID取模的方式,,比如也是按照1024取模,,技術(shù)上則也能保證訂單數(shù)據(jù)拆分到后端的1024個數(shù)據(jù)庫表中,但這里就會出現(xiàn)一個業(yè)務(wù)場景中帶來的問題,,就是如果有些賣家是交易量非常大的,,那這些賣家的訂單數(shù)據(jù)量(特別是訂單詳情表的數(shù)據(jù)量)會比其他賣家要多處不少,也就是會出現(xiàn)數(shù)據(jù)不平均的現(xiàn)象,,最終導致這些賣家的訂單數(shù)據(jù)所在的數(shù)據(jù)庫會相對其他數(shù)據(jù)庫提前進入數(shù)據(jù)歸檔(為避免在線交易數(shù)據(jù)庫的數(shù)據(jù)的增大帶來數(shù)據(jù)庫性能的問題,,一般將3個月內(nèi)的訂單數(shù)據(jù)保存在線交易數(shù)據(jù)庫中,超過3個月的訂單會歸檔后端專門的歸檔數(shù)據(jù)庫),。 所以從對『數(shù)據(jù)盡可能平均拆分』這條原則來看,,按照訂單ID取模的方式看起來更能保證訂單數(shù)據(jù)的平均拆分,但我們暫時不要這么快下結(jié)論,,也要根據(jù)不同的業(yè)務(wù)場景和最佳實踐角度多思考不同緯度帶來的優(yōu)缺點,。 總結(jié) 電商平臺的需求一直在變化,訂單系統(tǒng)的架構(gòu)也會隨之變化,,架構(gòu)設(shè)計就是一個持續(xù)改進的過程,,這篇文章還有好多細節(jié)未提及,如果你想把訂單系統(tǒng)做的更好,,需要更加深入系統(tǒng)的每一個環(huán)節(jié),,比如:容災(zāi)、災(zāi)備,、分流,、流控都需要慢慢雕琢,在架構(gòu)中沒有完美的架構(gòu)只有平衡的架構(gòu),,無需追求單點的完美,,而是要追求多點的平衡。 作者介紹 看完本文有收獲,?請轉(zhuǎn)發(fā)分享給更多人 |
|
來自: xujin3 > 《特定系統(tǒng)》