架构设计之三种业务模型:活动资源模型、契约模型、模板模型

共 6343字,需浏览 13分钟

 ·

2023-06-17 18:21






JAVA前线 







欢迎大家关注公众号「JAVA前线」查看更多精彩分享,主要内容包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时也非常欢迎大家加我微信「java_front」一起交流学习















1 文章概述


在实际开发场景中业务需求各式各样,在技术方案设计阶段,架构师的工作就是将业务语言翻译为技术语言。


业务场景多种多样,但是架构师需要发现不同业务相通之处,抽象成通用模型,这样后续再遇到需求,即使业务场景大相径庭,也可以使用同一套模型应对。本文分析三种业务模型:



  • 活动资源模型


  • 契约模型


  • 模板模型




2 活动资源模型




2.1 业务场景


商家A总共准备发放一种满100减10元优惠券100张,商家A有5家店铺,每个店铺优惠券发放规则各不相同:



  • 店铺1:每人限领1张


  • 店铺2:每人限领2张


  • 店铺3:只允许A城市用户领券


  • 店铺4:只允许新用户领券


  • 店铺5:只允许B城市C区老用户领券




2.2 模型分析




2.2.1 资源


各个店铺发放优惠券规则不同,但是优惠券只有一种,所以不可能将规则沉淀在优惠券,这就引出本文第一种模型:活动资源模型。优惠券作为一种资源只承载最本质属性:



  • 发放张数


  • 优惠类型(满减/满折)


  • 优惠金额


  • 折扣比例


  • 使用门槛金额


  • 有效期

发放张数控制资源总成本,需要仔细评估。





2.2.2 活动


那么店铺不同的发放规则在哪里体现?答案是活动领域。每个店铺可以根据经营策略,设置本店铺营销活动和不同活动规则,本例中各个店铺可以设置各种活动规则,但是共享同一份资源(100张优惠券)常见活动规则:



  • 活动开始时间


  • 活动截止时间


  • 资源领取类型(系统发放/手动领取)


  • 每人允许参与活动次数


  • 允许参与用户规则


  • 允许参与城市规则


  • 允许参与商品规则


  • 活动资源规则:每人允许领取X张资源




2.3 数据模型




2.3.1 资源相关



  • 优惠券表



    • 资源本质属性



  • 优惠券领取流水表



    • 资源领取记录



  • 优惠券使用流水表



    • 资源使用记录



  • 优惠券使用明细表



    • 订单优惠明细





2.3.2 活动相关



  • 活动表



    • 活动本质属性



  • 活动资源规则表



    • 每人允许领取X张资源



  • 活动地区规则表



    • 允许参与活动地区信息



  • 活动用户规则表



    • 允许参与活动用户信息



  • 活动商品规则表



    • 允许参与活动商品信息





3 契约模型




3.1 业务场景


商品A每个5元,用户购买3个并下单成功,但是还没有付款。此时卖家对商品价格做出调整改为每个100元,那么用户再付款时,应该付15元还是300元?





3.2 模型分析


订单本质上是一种契约,一旦签订(下单)核心信息就不允许更改。当时用户签订契约是每个5元,即使后续调整为每个100元,也不应该影响已签订契约


既然契约具有不可变性,那么契约对象就要保存签订时刻各类快照信息,订单就是一种非常典型的契约对象。





3.3 数据模型


本章节以订单模型为例介绍契约模型,这种模型特点是集各类快照大成,所有涉及信息都需要保留快照便于追溯。





3.3.1 基本信息



  • 订单编号


  • 业务类型


  • 下单渠道


  • 下单时间


  • 订单状态


  • 商家Id


  • 店铺Id


  • 下单用户Id




3.3.2 支付与促销信息



  • 支付方式(支付宝/微信/银行卡)


  • 支付单号


  • 支付账户


  • 应付金额


  • 实付金额


  • 使用优惠券Id


  • 优惠券抵扣金额


  • 用户权益抵扣金额


  • 参与促销活动Id


  • 营销活动抵扣金额


  • 运费金额




3.3.3 物流信息



  • 配送方式(物流/同城/自提)


  • 配送公司


  • 收货省、市、区


  • 收货详细地址


  • 收货人电话


  • 快递单号


  • 自提省市区


  • 自提详细地址


  • 自提商家电话




3.3.4 商品明细



  • 子订单Id


  • 子订单状态


  • skuId


  • skuTitle


  • 购买数量


  • 销售单价


  • 实付单价


  • 实付总金额


  • 分摊优惠券金额


  • 分摊用户权益金额


  • 分摊促销活动金额




3.4 漫长的流程


契约模型要记录如此多的快照信息,意味着契约系统需要与很多系统交互,例如在使用优惠券时,订单系统要询问优惠券系统能不能用优惠券。在用户支付时需要与支付系统交互,并等待支付系统回调。在用户支付完成15分钟后将订单下推至调度中心,进行发货调度。这也就意味着契约系统复杂度要比一般系统高。销售层订单一般流程:



  • 用户下单


  • 风控校验


  • 获取商品信息


  • 获取优惠券


  • 获取促销活动


  • 获取用户权益


  • 锁定库存(调度中心)


  • 计算运费(物流系统)


  • 生成不可见订单


  • 扣减库存


  • 扣减优惠券


  • 扣减用户权益


  • 占用活动资格


  • 订单可见(待支付)


  • 支付订单(已支付)


  • 订单下推


  • 物流发货


  • 用户签收(已完成)


  • 用户评价




4 模板模型




4.1 业务场景


商家可以设置不同城市的运费模板:



  • A城市:按件数计费



    • 首重:2件


    • 首费:1元


    • 续重:1件


    • 续费:1元



  • B城市:按重量计费



    • 首重:3公斤


    • 首费:1元


    • 续重:2公斤


    • 续费:1元


商家可以将商品与运费模板绑定,购买商品时读取运费模板计算运费。





4.2 模型分析


模板作用是定义规则,模板模型的作用是将业务对象与规则解耦,规则定义在模板,再与业务对象绑定。这样做有两个优点:第一是规则与业务对象解耦,第二是模板可以复用,相同规则不用重复设置。


我们可以对比模板模型与契约模型:契约模型是一旦签订,无论契约中原始数据如何变化,都不会改变契约。但是模板模型,业务对象在形成契约之前,需要实时感知模板内容变化,例如在下单前,商品绑定的运费模板续费调整,需要重新计算价格。





4.3 数据模型



  • 模板表



    • 定义规则



  • 业务对象与模板关系表



    • 建立业务对象与模板关系





5 文章总结


在设计技术方案时虽然需求表面各式各样,作为架构师需要思考能否抽取共通之处,本文介绍了三种常见的业务模型:活动资源模型、契约模型、模板模型。


活动资源模型中资源只设置资源本质属性,活动灵活控制规则。契约模型中一旦契约签订不允许再改变,这也意味着契约需要记录大而全的信息。模板模型中模板定义规则,业务对象绑定模板,并且需要实时感知模板变化。









JAVA前线 







欢迎大家关注公众号「JAVA前线」查看更多精彩分享,主要内容包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时也非常欢迎大家加我微信「java_front」一起交流学习








浏览 41
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报