李晶(大晶)
一、前言
本篇主要讲述下海拍客购物车中台发展及现状。
二、业务价值
首先说明下购物车的业务价值,如下图所示(购物车下单链路图、购物车业务功能图):
下单链路图:一条是从商详直接到下单页,是基础必备的下单链路;一条是用户将不同场景的商品加入进购物车,在购物车进行批量凑单;
购物车功能:用户侧:暂存商品到购物车、凑单、计算价格(运费、优惠、原价);商家侧:店铺活动透出、店铺券透出为商家促销引流;平台侧:用户的购买行为、加购行为提供数据基础;
综述:购物车不是下单必要的,但是却是提高下单转换率必要的。因为购物车汇聚多方角色和玩法,无论是引流、凑券都少不了。
三、业务发展
海拍客购物车业务是根据纵横两个维度发展。如下如所示,
- 深度玩法:初期购物车主要在深度玩法上,从有批次-》巨划算-》无批次-》包邮活动。不仅逐步增加购物车展示结构深度和复杂度,而且会有不同的操作粒度和交互方式。
- 广度玩法:现阶段购物车逐步开始横向发展,从Saas-》121-》主站小程序,会有同业务不同终端添加购物车功能,还会有新业务添加购物车功能
综述:可以看到现阶段购物车的快速复制,是业务需要技术支持的方向。
3.1、业务架构
随着业务的发展,目前的购物车业务架构如下图。分为3层:
- 业务渠道:该层根据三个维度解析来源,来处理业务的异同。分别是业务BU(根据BU\玩法\用户来划分)、终端(客户端\h5\小程序)、场景(有业务差异的页面)
- 业务域:该层是购物车的核心业务逻辑层,将购物车核心关注业务域有:商品、营销、供应商、用户。这四个业务域的玩法的变化都需要衡量对购物车的影响,无论新业务是如何玩,也都离不开这四个业务域
- 功能:该层是购物车的产品功能,有基础功能和个性功能。
综述:通过三个维度对购物车进行业务定位和相互组合
3.1.1、业务渠道
购物车通过3个维度来定义每个渠道,并感知业务差异,分别是业务BU、终端、场景。如下图所示,业务维度会再定义系统识别的类型和场景
- 业务BU:海拍客、Saas、PP、OMO,其中海拍客分为子业务:主站、TLZ、WXD等。这些业务的数据和用户都有一定隔离性、业务玩法差异也很大。通常会直接根据业务进行购物车类型划分,将购物车数据隔离。
- 终端:PC、APP、小程序。不同的业务有不同终端支持。不同的终端在交互、业务支持能力是不同的。比如PC的购物车会砍掉许多复杂商品和营销玩法,
- 场景:不同场景的数据做不同的展示交互,是目前购物车业务处理,所感知的最细粒度。比如在包邮活动页展示只有改包邮活动购物车数据;小商详和大商详加购的数据在店铺入口展示是有区别的。
综述:根据业务BU和业务因子进行购物车类型划分,购物车数据底层隔离掉;再根据终端和场景划分购物车场景(购物车子类型)。
3.1.2、业务域
无论是在主站、TLZ、PP、Saas等业务下,购物车核心关注的业务域是不变的,分别是:用户、供应商、商品、营销,【商品、营销】是购物车业务的最核心业务域。这里重要的是购物车需要感知的业务玩法,这些业务玩法可以在hpc对2B,也可以在omo对2C。
商品域里的商品玩法:
- 有无批次
- 跨境大贸
营销域的营销玩法:
- 活动:巨划算、包邮、无批次活动、促销直降活动
- 优惠券:平台券&店铺券
综述:之所以业务玩法重要,是因为玩法背后的业务因子:价格、运费、库存、限购、特性。这也是购物车在系统处理时的核心模型
3.2、系统架构
由上面业务架构与之对应的系统架构,如下:这里核心说明系统的业务架构,分为加购和购物车。
四、系统发展
随着公司业务不断拓新试错,新业务不断增加。降低业务耦合,提高代码复用,提升迭代效率也是公司全面主推的,各个业务线都开始中台化建设,购物车也是如此。购物车发展历程如下图,分为2个方向:
购物车中台场景:购物车业务需要改造的中台场景主要分为3部分:加购场景、购物车列表场景、购物车操作(加减数量、删除等)场景,其中比较复杂中台场景是购物车列表
购物车中台改造过程:列表场景的中台接口的完善分别经过以下3个阶段:出入参模型统一&流程组件化、多端场景路由&数据结构统一化、内部模型统一&分层复用优化
4.1、发展过程
在加购、购物车列表、购物车操作这3个场景中,购物车列表接口也是最复杂的,下面以购物车列表为例,详细说明下中台接口的发展过程。
- 图1:初期app和pc有不同的接口,随着业务新增,有些业务信息不需要在pc处理,出参模型逐渐分裂,形成多接口多模型实现层混合的现状。
- 图2:新玩法差异大时,没有足够扩展性的出参,业务耦合会比较大,迭代效率会比较低。所以需要出入参模型统一,采用继承抽象使出参具有高扩展性;使用组件化流程编排,业务流程变的内聚和复用
- 图3:业务和终端越来越多,根据来源处理差异性是必要的。必须要有多端识别的功能,不同的业务线有不同的流程编排,降低业务耦合;同时购物车底层数据结构也需要具有高扩展性,底层存储字段拟定核心域的信息后,还要有扩展字段
- 图4:整个中台架构基本成型,但是内部业务代码的复用性、扩展性、可读性依旧存在弊端:于是进行逻辑分层和内部模型\组件统一的优化。原因如下其一流程组价化内部模型过多,代码可读性和复用性较差,比如价格模型有3种,对价格的处理有许多兼容处理。因此进行了内部模型的统一,更加抽象聚合了流程,简化了组件数量;其二购物车除了处理信息查询校验,还有一个很重要的页面结构渲染逻辑。因此将页面模块切割最小粒度,不同模块进行组合处理,不同业务对每个模块的组合、排序、提示、交互也可以定制化,同时这定制化也可以对其他业务快速复用
综述:一个中台化接口可能需要朝着这四点方向处理:存储数据结构统一、多端场景识别、流程配置化、模型统一(出参和内部)。
4.1.1、分层化&内部模型统一化
下面简略讲述下中台优化现阶段的样子,具体的优化效果如下图,
- 分层优化:将页面渲染的代码上浮一层。划分为聚合、排序、操作、提示四个部分。再将页面模块进行细粒度切割,每个模块依次进行这四个部分的处理。不同业务可以快速复用已有的页面渲染,
- 内部模型统一:原有组件划分根据业务玩法,现在根据抽象的统一内部模型抽象划分,使业务组件具有扩展性和复用性,页面层渲染使用的内部模型更简单;
4.3、中台应用实践
4.3.1、快速复制
以最近需求为例,给小程序终端添加购物车功能。
- 首先-定位业务点:按照下图对购物车的处理进行选择定位。确定影响点。
- 其次-分配场景&路由场景:根据定位分配场景枚举值,并根据场景枚举值【路由到老流程】或者【配置新流程】,此场景是复用(分别在加购、购物车展示、购物车操作场景进行路由或配置)
- 最后-搭建页面模块:新创建该场景页面模块类,【复用或新配置】现有模块的聚合、操作、提示、排序逻辑即可,此场景是复用。
4.3.1、快速扩展
以omo购物车为例,步骤和例1一致,但是新业务的无批次活动价处理和主站不同,这里需要扩展。omo营销业务域下所需要处理的活动扩展点,进行扩展,降低业务耦合
<!--OMO购物车营销组件-->
<bean id="omoCartPromotionComponent" class="com.yt.buy.cart.engine.component.hpc.CartPromotionComponent">
<property name="cartActiveExts">
<list>
<bean id="omoCartNoBatchActiveExt"
class="com.yt.buy.cart.engine.ext.query.impl.actives.OmoCartNoBatchActiveExtImpl"/>
</list>
</property>
</bean>
<!--HPC购物车营销组件-->
<bean id="cartPromotionComponent" class="com.yt.buy.cart.engine.component.hpc.CartPromotionComponent">
<property name="cartActiveExts">
<list>
<bean id="cartFlashActiveExt"
class="com.yt.buy.cart.engine.ext.query.impl.actives.CartFlashActiveExtImpl"/>
<bean id="cartFreeShippingActiveExt"
class="com.yt.buy.cart.engine.ext.query.impl.actives.CartFreeShippingActiveExtImpl"/>
<bean id="cartNoBatchActiveExt"
class="com.yt.buy.cart.engine.ext.query.impl.actives.CartNoBatchActiveExtImpl"/>
</list>
</property>
</bean>
五、未来展望
现有的架构设计在扩展性、复用性、业务耦合性上都可以满足使用。但是对场景的配置不够清晰,目前是半配置化半硬编码。如果可以手动页面配置,页面可视化,会更加高效迭代