本文讲述 vivo 官方商城从单体应用到具备综合能力电商平台的演进,系统架构往服务化、中台化的变迁历程。

一、前言

vivo官方商城,是vivo官方的线上电商平台,主营vivo手机及专属配件。经过几年发展,已经完成了从单体应用到具备综合能力电商平台的演进,整体系统架构也逐步往服务化、中台化变迁。我们在这条系统架构升级的道路中,实践出了一些系统架构经验。

通过本篇文章,可以让对电商感兴趣的小伙伴们,更为全面地了解最基础的电商业务模式,了解电商体系具备的技术和架构,了解系统在不同时期的架构演进。

二、架构变迁史

“冰冻三尺,非一日之寒”。任何一个电商系统的架构升级,都不是一蹴而就的,都需要一个稳步发展的过程,不同阶段业务发展的形态和体量决定着系统架构。下面从一张图开始,给大家描述下商城近几年架构变迁的历史。

(图1.1 vivo官方商城架构变迁历程)

2015年之前,vivo官方商城是外包项目,采用了市面上比较成熟的 ECStore(企业级开源网上电商系统)电商产品作为系统基础,主语言是PHP。

项目版本就是在此基础上进行二次开发迭代。

和大多数电商平台早期的发展一样,满足快速部署、快速上线。

同时弊端也很明显:

  • 性能很差,根本无法支撑稍大一点的运营活动。当有新品、大促活动,系统负载高,业务基本处于不可用状态,无法满足运营活动需求。
  • 需求沟通效率,研发效率低下,外包研发、产品异地办公,需求沟通困难。
  • 核心项目受制于人,vivo 官方商城必须掌握在自己手中。

为了解决这些问题,架构迫切需要升级、系统需要重构。

2.1 商城 v1.0 单体时期

2015年5月,vivo官方商城正式启动重构计划。vivo启用自己的研发团队,目标很明确,自研一套属于自己的vivo官方商城,为用户提供更好的购物体验。

在2016年1月,属于我们自己的vivo官方商城正式上线了。

商城v1.0以主流的 Java 作为开发语言,采用经典的 MVC 框架,开发出了一个囊括了各个业务模块的单体应用,整体业务模块如下图所示:

(图2.1 商城v1.0系统架构)

相比之前,这次重构最重要的指导思想就是“分层”。

业务上对各个模块进行逻辑分层。划分出了商品模块、订单模块、营销模块、结算模块等等,使得代码逻辑更为清晰。

架构上也进行分层解耦:

  • 【表现层】– 最贴近用户的一层,主要用来处理数据展示逻辑并渲染数据;
  • 【服务层】– 负责表现层与数据层之间的业务逻辑;
  • 【数据层】– 负责数据的落地存储,存储介质使用常用的Mysql和Redis;

单体应用的时期,vivo官方商城业务发展尚处于初期,业务复杂度不高。首页、商详页、结算页逻辑比较简单轻量。

v1.0的架构完全能够满足支撑日常的新品及活动运营,且版本迭代更为快速。相比于ECStore 性能提升了至少两个量级,所以商城v1.0的重构非常成功。

2.2 商城 v2.0  服务化

官方商城 v1.0 架构升级之后,平稳地度过了一段时间。近两年,vivo手机产品越来越多,线上业务开始迅猛发展。

随之而来的是用户量级的快速增长,商城v1.0的单体架构弊端也逐渐暴露:

  • 飞速增长的用户访问流量让性能再次出现瓶颈,单体的数据库和Redis难以抵挡。
  • v1.0 架构对业务模块进行了分层,分层仅限于代码模块级别的拆分,没有从物理上进行隔离,单体应用愈发臃肿。
  • 所有研发维护同一套代码,项目工程维护变得困难。快速迭代的版本让模块之间分层的界限变得模糊,代码腐化严重,开发效率变得低下。

基于以上问题,我们开始基于业务模块进行垂直的系统物理拆分。新的系统架构采用主流的SOA架构(Service Oriented Architecture,即面向服务的架构)。

商城 v2.0 从2017年开始,以服务化为核心稳步进行拆分独立。我们得保证既有的业务不受丝毫影响的情况下独立模块,有人形容这个过程为“高速换轮胎”,动作稍有不慎,对系统来说都是致命的。

最终在花了近一年半的时间,我们实现了活动、商品、订单、优惠券四大核心系统的拆分。拆分出来业务线开始各司其职,提供服务化的能力,共同支撑主站业务。

(图2.2 商城 v2.0系统架构)

下面将介绍各个系统拆分的整个过程。

2.2.1 活动系统独立

官方商城作为vivo的唯一线上官方渠道,承载着所有新品的线上活动需求。每次的新品发布会,都是由商城系统负责完成。大量频繁的活动需求,引起频繁的商城版本变更、上线,引发我们的思考。

相比电商的核心交易链路,活动系统本身比较独立,不应与主线交易耦合在一起。因此在2017年年中,将商城中的专题页配置,新品发布会,抽奖,预约功能剥离出来,独立出了商城活动系统。

2017年8月,活动系统独立上线。新的活动系统开始承接新品、大促等各种促销活动需求。随着活动系统不断迭代发展,目前已经成为电商平台一个重要组成部分。

2.2.2 商品系统独立

商品系统是支撑整个电商平台的核心,是电商系统中最重要的组成部分。商品连接着用户和平台,通过商品的详情页可以完美地向用户展示产品内容,诠释产品内涵。

商城 v2.0 服务化,商品是这次整改的重点。

我们在思考v1.0架构带来系统性问题的时候,也开始思考如何通过这次拆分来对应未来的业务增长。商城v1.0商品模块亟待解决的问题:

  • 商品的品类创建受限,只有垂直类的手机和配件,无法支持全品类。
  • 商品不支持店铺、品牌维度,比较单一。
  • v1.0商品模块的查询性能低下,单实例Redis无法满足高性能、高可用。
  • 历史 v1.0商品接口和模型已经渗透到各个模块,完整地剥离出来比较困难。

商品系统的独立是带着以上的问题和思考进行的,大的目标是划清业务边界,彻底和商城解耦。我们希望分离后的商品系统能够更好、更快速地承接未来全品类的扩展,全面服务化。为进一步服务好商城主体业务夯实基础。

2.2.3 优惠券系统独立

优惠券是业界内常用的营销手段之一,每到大促、节假日、新品,都会发放大量的优惠券。与外部广告商合作、内购福利、保值换新等也以优惠券的形式承载。

随着营销活动力度加大,优惠券使用场景增多,优惠券系统问题也逐渐暴露:

  • 海量优惠券的发放,达到优惠券单库、单表存储瓶颈。
  • 与商城系统的高耦合,也直接影响了商城整站接口性能。
  • 针对多品类优惠券,技术层面没有沉淀通用优惠券能力。

优惠券系统独立需要解决的就是以上问题,独立后优惠券存储能力提升,支撑未来5年内的优惠券发放量级。整体发券接口性能也得到提升,发券由原来的异步发券、异步到账,优化到同步发券、实时到账。同时提供平台级优惠券能力,面向全公司业务,提供通用的优惠券营销能力。

2.2.4 订单系统独立

订单系统也有与优惠券同样的问题,随着用户量级的爆发式增长,性能问题逐渐暴露:

  • 数据不断累积,快要达到单表存储瓶颈,导致订单的查询和修改速度很慢。
  • 单机MySQL处理能力有限,并发量上来时直接拖垮整个商城的所有业务。

订单系统的独立,首次引入了 ES,Sharding-JDBC 等技术组件,解决数据量和高并发的痛点。订单系统上线后,无论是订单的存储量级还是下单的并发量级,都提高了不止十倍,至少满足未来 5 年的业务高速发展。

至此,商城核心系统拆分完成,各系统提供统一标准化服务,具备更纯粹的业务基础能力,与商城主站解耦,迭代效率大幅提升。

2.3 商城 v3.0  业务系统拓展

商城 v3.0 是针对商城业务快速发展,进行的业务系统完善。

这一阶段由于商城业务渠道不断扩展,促销玩法不断增多,商城衍生出很多独立的业务子系统。其中包含代销系统、CPS系统、促销系统 3 大业务系统。

(图2.3 商城 v3.0系统架构)

2.3.1 代销系统:商城与代销商品纽带

为了丰富自身的商品品类,支撑起更多的运营玩法,我们开始探索代销的业务,尝试对接品类优质的平台方。很多平台方也都支持系统对接,采用以销定采的销售模式。

代销系统就在此背景下诞生了。我们希望代销系统能够成为外部平台方和vivo商城之间的“粘合剂”,并能够提供以下的主要功能:

  • 支持两个平台商品数据模型的转换,支持部分信息二次编辑,更加本地化。
  • 实时同步平台方商品库存、价格、订单正逆向信息的同步。
  • 支持vivo商城用户的商品浏览、以及下订单服务,满足用户购物的完美体验。

代销系统是我们对接外部系统,引入外部商品售卖的一次尝试。代销的通用能力被我们完全沉淀了下来,能够持续支撑后续其他平台商品接入。

2.3.2 CPS系统:商城返利平台

CPS 系统的定位是 vivo 官方商城体系下的推广返利平台系统。商城的业务不断扩展,商城的业务群体也开始向外拓展。主要针对一些带货能力强的大V以及一些外部推广平台,以返佣的形式,最大限度发挥其带货能力。

随着用户群体以及推广平台接入,CPS 系统逐渐沉淀一些基础能力,目前支持 toB、 toC 通用接入能力。

2.3.3 促销系统:商城营销百花齐放

促销系统是商城的促销中心,承载着商城所有的营销玩法。

促销系统的独立,源于商城v2.0 架构无法满足不断增加的活动玩法,它解决了商城原有促销的以下痛点:

  • 繁杂的活动堆砌,没有严格活动优先级关系。
  • 新的活动需求的加入,改动量和影响点范围广,无法准确评估。
  • 促销性能无法满足活动量级,往往会影响商城主站的性能。

促销系统独立,与商城解耦,提供纯粹的商城营销活动玩法。促销系统还包括:商品计价与商品价格监控基础能力。

三、国际化

随着经济全球化日益加深,国产品牌纷纷布局海外,印度作为海外最大单一市场,拥有非常广阔的市场前景,顺应当地市场的需求,上线印度版官方商城提上日程。

2017年12月,印度vivo官方商城正式上线运营。

印度官方语言共有22种,目前已登记的语言超过1600种,支持多语言是国际化进程中首要课题。传统的 i18n 方案,能够解决基本的文案配置问题,但是项目需要走发布流程,维护成本非常高。

多语言文案系统标准化了文案需求的提出、翻译、测试、发布等流程,极大地提升了发布效率和文案质量。

(图3.1  多语言文案中心)

2020年11月,泰国 vivo 官方商城也正式上线运营。

与国内电商相比,海外电商业务需要覆盖多个国家/地区,每个地区都有自己的语言、时区、货币等等,如何使用一套代码同时支持多个地区,是我们必须要面对并且解决的问题。

经过3年时间的摸索和打磨,我们打造出了一套通用的全球化解决方案,包括多语言文案系统、多时区通用组件、多国家隔离框架、多机房域名部署方案等等,已经能够较好的支撑当前业务的发展需要。

(图3.2  多时区通用组件)

(图3.3  多国家隔离框架)

上述方案,抽象公共配置的思想以及相应的隔离技术点,即使是在非国际化场景中,也具有较大的参考价值。

海外市场复杂多变,语言文字、文化差异、地区标准、法律法规等不尽相同,地区发展阶段和基础设施成熟度也有较大差异。

挑战与机会并存,我们既要全力支撑业务发展,也要优先完成合规整改要求;我们既要提炼一套通用的国际化架构,也要满足本地化定制需求;我们既要合理应用发达地区高网速,也要兼顾欠发达地区页面加载性能优化。

“more local more global”,随着全球化进程的加深,我们会继续锤炼全球化架构,锻造出更加健壮的国际化/本地化产品。

写在最后,本篇主要是简要的介绍vivo官方商城这5年来的一些大的架构历史变迁,不做过多的技术解读。

这里的介绍只是商城技术背后的冰山一角,后续我们会出更多相关系列文章,去详细介绍每个系统的架构与核心技术。

作者:vivo 官网商城开发团队

vivo 全球商城:架构演进之路的更多相关文章

  1. vivo全球商城全球化演进之路——多语言解决方案

    一.背景 随着经济全球化的深入,许多中国品牌纷纷开始在海外市场开疆扩土.实现全球化意味着你的产品或者应用需要能够在全球各地的语言环境使用,我们在进行海外业务的推进时,需要面对的最大挑战就是多语言问题. ...

  2. vivo 全球商城:电商平台通用取货码设计

    vivo官网商城开发团队 - Zhou Longjian 一.背景 随着O2O线上线下业务的不断扩展,电商平台也在逐步完善交易侧相关的产品功能.在最近的需求版本中,业务方为进一步提升用户的使用体验,规 ...

  3. vivo全球商城:电商交易平台设计

    作者:vivo 官网商城开发团队 - Cheng Kun.Liu Wei 本文介绍了交易平台的设计理念和关键技术方案,以及实践过程中的思考与挑战. 点击查阅:<vivo 全球商城>系列文章 ...

  4. 转:微信Android客户端架构演进之路

    转自: http://www.infoq.com/cn/articles/wechat-android-app-architecture 微信Android客户端架构演进之路 作者 赵原 发布于 20 ...

  5. vivo全球商城-营销价格监控方案的探索

    一.背景 现在日常官网商城的运营中有一定概率出现以下两个问题: 1)优惠信息未对齐 官网商城促销优惠的类型越来越多,能影响最终用户实付价的优惠就有抢购.满减.优惠券.代金券等.实际业务操作中存在不同促 ...

  6. 【IT名人堂】何云飞:阿里云数据库的架构演进之路

    [IT名人堂]何云飞:阿里云数据库的架构演进之路 原文转载自:IT168 ​ 如果说淘宝革了零售的命,那么DT革了企业IT消费的命.在阿里巴巴看来,DT时代,企业IT消费的模式变成了“云服务+数据”, ...

  7. 精华阅读第 9 期 |滴滴出行 iOS 客户端架构演进之路

    「架构都是演变出来的,没有最好的架构,只有最合适的架构!」最近,滴滴出行平台产品中心 iOS 技术负责人李贤辉接受了 infoQ 的采访,阐述了滴滴的 iOS 客户端架构模式与演变过程.李贤辉也是移动 ...

  8. 从游击队到正规军:马蜂窝旅游网的IM系统架构演进之路

    本文引用自马蜂窝公众号,由马蜂窝技术团队原创分享. 一.引言 今天,越来越多的用户被马蜂窝持续积累的笔记.攻略.嗡嗡等优质的分享内容所吸引,在这里激发了去旅行的热情,同时也拉动了马蜂窝交易的增长.在帮 ...

  9. QQ音乐PB级ClickHouse实时数据平台架构演进之路

    导语 | OLAP(On-Line Analytical Processing),是数据仓库系统的主要应用形式,帮助分析人员多角度分析数据,挖掘数据价值.本文基于QQ音乐海量大数据实时分析场景,通过Q ...

  10. vivo 全球商城:商品系统架构设计与实践

    一.前言 随着用户量级的快速增长,vivo官方商城v1.0的单体架构逐渐暴露出弊端:模块愈发臃肿.开发效率低下.性能出现瓶颈.系统维护困难. 从2017年开始启动的v2.0架构升级,基于业务模块进行垂 ...

随机推荐

  1. springboot下添加全局异常处理和自定义异常处理

    前言 在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便. 相关代码: ...

  2. 关于C#接口的用法详细解答,附上案例说明!

    接口 C#中的接口是一种定义了一组方法.属性和事件的类型.它只包含成员的声明,而不包含任何实现.接口可以被类通过实现的方式使用,从而使类能够具有接口定义的行为. 接口在C#中被定义为使用interfa ...

  3. SpringBoot发送虚拟请求~

    1.创建一个测试用的TestController @RestController public class TestController { @GetMapping("/test" ...

  4. SpringBoot整合Swagger3

    1.导入相关依赖 <!--swagger--> <dependency> <groupId>io.springfox</groupId> <art ...

  5. [简单] 基于注解玩转excel导出导入

    基于注解玩转excel导出导入 demo 请 加入 598347590 技术解决群获取 个人博客 https://yangbuyi.top 话不多说 开始 <!-- poi office --& ...

  6. 微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费

    微软真是活菩萨,面向初学者的机器学习.数据科学.AI.LLM课程统统免费 大家好,我是老章 推荐几个质量上乘且完全免费的微软开源课程 面向初学者的机器学习课程 地址:https://microsoft ...

  7. 在Windows操作系统中,使用powershell脚本批量删除、批量替换文件名

    比如我们下载的mp3文件或者小说.评书里都带很多作者.网站等信息,如何批量一键删除掉多余的字段呢? 下面举例:批量删除文件名称 可以看到原文中,所有文件名中均包含"小番茄与火龙果-" ...

  8. Pikachu漏洞靶场 RCE(远程命令执行/代码执行)

    RCE 文章目录 RCE 概述 exec "ping" exec "eval" 概述 RCE(remote command/code execute),远程命令 ...

  9. f-VAEGAN-D2:VAE+GAN处理零样本学习问题

    虽然f-VAEGAN-D2在题目中说"适用任意样本",但对比的Few-shot相关的实验较少,这里仅讨论零样本学习的情况. 1. 背景介绍 由于为每个对象收集足够数量的高质量带标签 ...

  10. Vue.js 原理分析

    本文内容提炼于<Vue.js设计与实现>,全书共 501 页,对 Vue.js 的设计原理从 0 到 1,循序渐进的讲解. 篇幅比较长,需要花些时间慢慢阅读,在合适的位置会给出在线示例以供 ...