架構(gòu)設(shè)計(jì)之三種業(yè)務(wù)模型:活動(dòng)資源模型、契約模型、模板模型
JAVA前線?
歡迎大家關(guān)注公眾號(hào)「JAVA前線」查看更多精彩分享,主要內(nèi)容包括源碼分析、實(shí)際應(yīng)用、架構(gòu)思維、職場分享、產(chǎn)品思考等等,同時(shí)也非常歡迎大家加我微信「java_front」一起交流學(xué)習(xí)
在實(shí)際開發(fā)場景中業(yè)務(wù)需求各式各樣,在技術(shù)方案設(shè)計(jì)階段,架構(gòu)師的工作就是將業(yè)務(wù)語言翻譯為技術(shù)語言。
業(yè)務(wù)場景多種多樣,但是架構(gòu)師需要發(fā)現(xiàn)不同業(yè)務(wù)相通之處,抽象成通用模型,這樣后續(xù)再遇到需求,即使業(yè)務(wù)場景大相徑庭,也可以使用同一套模型應(yīng)對(duì)。本文分析三種業(yè)務(wù)模型:
- 活動(dòng)資源模型
- 契約模型
- 模板模型
2 活動(dòng)資源模型
2.1 業(yè)務(wù)場景
商家A總共準(zhǔn)備發(fā)放一種滿100減10元優(yōu)惠券100張,商家A有5家店鋪,每個(gè)店鋪優(yōu)惠券發(fā)放規(guī)則各不相同:
- 店鋪1:每人限領(lǐng)1張
- 店鋪2:每人限領(lǐng)2張
- 店鋪3:只允許A城市用戶領(lǐng)券
- 店鋪4:只允許新用戶領(lǐng)券
- 店鋪5:只允許B城市C區(qū)老用戶領(lǐng)券
2.2 模型分析
2.2.1 資源
各個(gè)店鋪發(fā)放優(yōu)惠券規(guī)則不同,但是優(yōu)惠券只有一種,所以不可能將規(guī)則沉淀在優(yōu)惠券,這就引出本文第一種模型:活動(dòng)資源模型。優(yōu)惠券作為一種資源只承載最本質(zhì)屬性:
- 發(fā)放張數(shù)
- 優(yōu)惠類型(滿減/滿折)
- 優(yōu)惠金額
- 折扣比例
- 使用門檻金額
- 有效期
發(fā)放張數(shù)控制資源總成本,需要仔細(xì)評(píng)估。
2.2.2 活動(dòng)
那么店鋪不同的發(fā)放規(guī)則在哪里體現(xiàn)?答案是活動(dòng)領(lǐng)域。每個(gè)店鋪可以根據(jù)經(jīng)營策略,設(shè)置本店鋪營銷活動(dòng)和不同活動(dòng)規(guī)則,本例中各個(gè)店鋪可以設(shè)置各種活動(dòng)規(guī)則,但是共享同一份資源(100張優(yōu)惠券)常見活動(dòng)規(guī)則:
- 活動(dòng)開始時(shí)間
- 活動(dòng)截止時(shí)間
- 資源領(lǐng)取類型(系統(tǒng)發(fā)放/手動(dòng)領(lǐng)?。?/li>
- 每人允許參與活動(dòng)次數(shù)
- 允許參與用戶規(guī)則
- 允許參與城市規(guī)則
- 允許參與商品規(guī)則
- 活動(dòng)資源規(guī)則:每人允許領(lǐng)取X張資源
2.3 數(shù)據(jù)模型
2.3.1 資源相關(guān)
-
優(yōu)惠券表
- 資源本質(zhì)屬性
-
優(yōu)惠券領(lǐng)取流水表
- 資源領(lǐng)取記錄
-
優(yōu)惠券使用流水表
- 資源使用記錄
-
優(yōu)惠券使用明細(xì)表
- 訂單優(yōu)惠明細(xì)
2.3.2 活動(dòng)相關(guān)
-
活動(dòng)表
- 活動(dòng)本質(zhì)屬性
-
活動(dòng)資源規(guī)則表
- 每人允許領(lǐng)取X張資源
-
活動(dòng)地區(qū)規(guī)則表
- 允許參與活動(dòng)地區(qū)信息
-
活動(dòng)用戶規(guī)則表
- 允許參與活動(dòng)用戶信息
-
活動(dòng)商品規(guī)則表
- 允許參與活動(dòng)商品信息
3 契約模型
3.1 業(yè)務(wù)場景
商品A每個(gè)5元,用戶購買3個(gè)并下單成功,但是還沒有付款。此時(shí)賣家對(duì)商品價(jià)格做出調(diào)整改為每個(gè)100元,那么用戶再付款時(shí),應(yīng)該付15元還是300元?
3.2 模型分析
訂單本質(zhì)上是一種契約,一旦簽訂(下單)核心信息就不允許更改。當(dāng)時(shí)用戶簽訂契約是每個(gè)5元,即使后續(xù)調(diào)整為每個(gè)100元,也不應(yīng)該影響已簽訂契約。
既然契約具有不可變性,那么契約對(duì)象就要保存簽訂時(shí)刻各類快照信息,訂單就是一種非常典型的契約對(duì)象。
3.3 數(shù)據(jù)模型
本章節(jié)以訂單模型為例介紹契約模型,這種模型特點(diǎn)是集各類快照大成,所有涉及信息都需要保留快照便于追溯。
3.3.1 基本信息
- 訂單編號(hào)
- 業(yè)務(wù)類型
- 下單渠道
- 下單時(shí)間
- 訂單狀態(tài)
- 商家Id
- 店鋪Id
- 下單用戶Id
3.3.2 支付與促銷信息
- 支付方式(支付寶/微信/銀行卡)
- 支付單號(hào)
- 支付賬戶
- 應(yīng)付金額
- 實(shí)付金額
- 使用優(yōu)惠券Id
- 優(yōu)惠券抵扣金額
- 用戶權(quán)益抵扣金額
- 參與促銷活動(dòng)Id
- 營銷活動(dòng)抵扣金額
- 運(yùn)費(fèi)金額
3.3.3 物流信息
- 配送方式(物流/同城/自提)
- 配送公司
- 收貨省、市、區(qū)
- 收貨詳細(xì)地址
- 收貨人電話
- 快遞單號(hào)
- 自提省市區(qū)
- 自提詳細(xì)地址
- 自提商家電話
3.3.4 商品明細(xì)
- 子訂單Id
- 子訂單狀態(tài)
- skuId
- skuTitle
- 購買數(shù)量
- 銷售單價(jià)
- 實(shí)付單價(jià)
- 實(shí)付總金額
- 分?jǐn)們?yōu)惠券金額
- 分?jǐn)傆脩魴?quán)益金額
- 分?jǐn)偞黉N活動(dòng)金額
3.4 漫長的流程
契約模型要記錄如此多的快照信息,意味著契約系統(tǒng)需要與很多系統(tǒng)交互,例如在使用優(yōu)惠券時(shí),訂單系統(tǒng)要詢問優(yōu)惠券系統(tǒng)能不能用優(yōu)惠券。在用戶支付時(shí)需要與支付系統(tǒng)交互,并等待支付系統(tǒng)回調(diào)。在用戶支付完成15分鐘后將訂單下推至調(diào)度中心,進(jìn)行發(fā)貨調(diào)度。這也就意味著契約系統(tǒng)復(fù)雜度要比一般系統(tǒng)高。銷售層訂單一般流程:
- 用戶下單
- 風(fēng)控校驗(yàn)
- 獲取商品信息
- 獲取優(yōu)惠券
- 獲取促銷活動(dòng)
- 獲取用戶權(quán)益
- 鎖定庫存(調(diào)度中心)
- 計(jì)算運(yùn)費(fèi)(物流系統(tǒng))
- 生成不可見訂單
- 扣減庫存
- 扣減優(yōu)惠券
- 扣減用戶權(quán)益
- 占用活動(dòng)資格
-
訂單可見(待支付)
- 支付訂單(已支付)
- 訂單下推
- 物流發(fā)貨
- 用戶簽收(已完成)
- 用戶評(píng)價(jià)
4 模板模型
4.1 業(yè)務(wù)場景
商家可以設(shè)置不同城市的運(yùn)費(fèi)模板:
-
A城市:按件數(shù)計(jì)費(fèi)
- 首重:2件
- 首費(fèi):1元
- 續(xù)重:1件
- 續(xù)費(fèi):1元
-
B城市:按重量計(jì)費(fèi)
- 首重:3公斤
- 首費(fèi):1元
- 續(xù)重:2公斤
- 續(xù)費(fèi):1元
商家可以將商品與運(yùn)費(fèi)模板綁定,購買商品時(shí)讀取運(yùn)費(fèi)模板計(jì)算運(yùn)費(fèi)。
4.2 模型分析
模板作用是定義規(guī)則,模板模型的作用是將業(yè)務(wù)對(duì)象與規(guī)則解耦,規(guī)則定義在模板,再與業(yè)務(wù)對(duì)象綁定。這樣做有兩個(gè)優(yōu)點(diǎn):第一是規(guī)則與業(yè)務(wù)對(duì)象解耦,第二是模板可以復(fù)用,相同規(guī)則不用重復(fù)設(shè)置。
我們可以對(duì)比模板模型與契約模型:契約模型是一旦簽訂,無論契約中原始數(shù)據(jù)如何變化,都不會(huì)改變契約。但是模板模型,業(yè)務(wù)對(duì)象在形成契約之前,需要實(shí)時(shí)感知模板內(nèi)容變化,例如在下單前,商品綁定的運(yùn)費(fèi)模板續(xù)費(fèi)調(diào)整,需要重新計(jì)算價(jià)格。
4.3 數(shù)據(jù)模型
-
模板表
- 定義規(guī)則
-
業(yè)務(wù)對(duì)象與模板關(guān)系表
- 建立業(yè)務(wù)對(duì)象與模板關(guān)系
5 文章總結(jié)
在設(shè)計(jì)技術(shù)方案時(shí)雖然需求表面各式各樣,作為架構(gòu)師需要思考能否抽取共通之處,本文介紹了三種常見的業(yè)務(wù)模型:活動(dòng)資源模型、契約模型、模板模型。
活動(dòng)資源模型中資源只設(shè)置資源本質(zhì)屬性,活動(dòng)靈活控制規(guī)則。契約模型中一旦契約簽訂不允許再改變,這也意味著契約需要記錄大而全的信息。模板模型中模板定義規(guī)則,業(yè)務(wù)對(duì)象綁定模板,并且需要實(shí)時(shí)感知模板變化。
JAVA前線?
歡迎大家關(guān)注公眾號(hào)「JAVA前線」查看更多精彩分享,主要內(nèi)容包括源碼分析、實(shí)際應(yīng)用、架構(gòu)思維、職場分享、產(chǎn)品思考等等,同時(shí)也非常歡迎大家加我微信「java_front」一起交流學(xué)習(xí)
