首页>资讯 > 图片资讯 > 正文

世界今热点:vivo全球商城:电商交易平台设计

来源:vivo互联网技术    2023-04-13 12:20:13


【资料图】

一、背景

vivo官方商城经过了七年的迭代,从单体架构逐步演进到微服务架构,我们的开发团队沉淀了许多宝贵的技术与经验,对电商领域业务也有相当深刻的理解。

去年初,团队承接了O2O商城的建设任务,还有即将成立的礼品中台,以及官方商城的线上购买线下门店送货需求,都需要搭建底层的商品、交易和库存能力。

为节约研发与运维成本,避免重复造轮子,我们决定采用平台化的思想来搭建底层系统,以通用能力灵活支撑上层业务的个性化需求。

包括交易平台、商品平台、库存平台、营销平台在内的一整套电商平台化系统应运而生

本文将介绍交易平台的架构设计理念与实践,以及上线后持续迭代过程中的挑战与思考。

二、整体架构2.1 架构目标

除了高并发、高性能、高可用这三高外,还希望做到:

低成本注重模型与服务的可重用性,灵活支撑各业务的个性化需求,提高开发效率,降低人力成本。高扩展系统架构简单清晰,应用系统间耦合低,容易水平扩展,业务功能增改方便快捷。

2.2 系统架构

(1)电商平台整体架构中的交易平台

(2)交易平台系统架构

2.3 数据模型

三、关键方案设计3.1 多租户设计

(1)背景和目标

交易平台面向多个租户(业务方),需要能够存储大量订单数据,并提供高可用高性能的服务。不同租户的数据量和并发量可能有很大区别,要能根据实际情况灵活分配存储资源。

(2)设计方案

考虑到交易系统OLTP特性和开发人员熟练程度,采用MySQL作为底层存储、ShardingSphere作为分库分表中间件,将用户标识(userId)作为分片键,保证同一个用户的订单落在同一个库中。接入新租户时约定一个租户编码(tenantCode),所有接口都要带上这个参数;租户对数据量和并发量进行评估,分配至少满足未来五年需求的库表数量。租户与库表的映射关系:租户编码 -> {库数量,表数量,起始库编号,起始表编号}。

通过上面的映射关系,可以为每个租户灵活分配存储资源,数据量很小的租户还能复用已有的库表。

示例一:

新租户接入前已有4库*16表,新租户的订单量少且并发低,直接复用已有的0号库0号表,映射关系是:租户编码-> 1,1,0,0

示例二:

新租户接入前已有4库*16表,新租户的订单量多但并发低,用原有的0号库中新建8张表来存储,映射关系是:租户编码-> 1,8,0,16

示例三:

新租户接入前已有4库*16表,新租户的订单量多且并发高,用新的4库*8表来存储,映射关系是:租户编码-> 4,8,4,0

用户订单所属库表计算公式

库序号 = Hash(userId) / 表数量 % 库数量 + 起始库编号表序号 = Hash(userId) % 表数量 + 起始表编号

可能有小伙伴会问:为什么计算库序号时要先除以表数量?下面的公式会有什么问题?

库序号 = Hash(userId) % 库数量 + 起始库编号表序号 = Hash(userId) % 表数量 + 起始表编号

答案是,当库数量和表数量存在公因数时,会存在倾斜问题,先除以表数量就能剔除公因数。

以2库4表为例,对4取模等于1的数,对2取模也一定等于1,因此0号库的1号表中不会有任何数据,同理,0号库的3号表、1号库的0号表、1号库的2号表中都不会有数据。

路由过程如下图所示:

(3)局限性和应对办法

全局唯一ID

问题:分库分表后,数据库自增主键不再全局唯一,不能作为订单号来使用。且很多内部系统间的交互接口只有订单号,没有用户标识这个分片键。

方案:如下图所示,参考雪花算法来生成全局唯一订单号,同时将库表编号隐含在其中(两个5bit分别存储库表编号),这样就能在没有用户标识的场景下,从订单号中获取库表编号。

全库全表搜索

问题:管理后台需要根据各种筛选条件,分页查询所有满足条件的订单。

方案:将订单数据冗余存储一份到搜索引擎Elasticsearch中,满足各种场景下的快速灵活查询需求。

3.2 状态机设计

(1)背景

之前做官方商城时,由于是定制化业务开发,各类型的订单和售后单的状态流转都是写死的,比如常规订单在下单后是待付款,付款后是待发货,发货后是待收货;虚拟商品订单不需要发货,没有待发货状态。现在要做的是平台系统,不可能再为每个业务方做定制化开发,否则会导致频繁改动发版,代码错综冗余。

(2)目标

引入订单状态机,能为每个业务方配置多套差异化的订单流程,类似于流程编排。新增订单流程时,尽可能不改动代码,实现状态和操作的可复用性。

(3)方案

在管理后台为每个租户维护一系列订单类型,数据转化为JSON格式存储在配置中心,或存储在数据库并同步到本地缓存中。每个订单类型的配置包括:初始订单状态,以及每个状态下允许的操作和操作之后的目标状态。当订单在执行某个动作时,使用订单状态机来修改订单状态。订单状态机的公式是:StateMachine(E,S —> A,S’)表示订单在事件E的触发下执行动作A,并从原状态S转化为目标状态S’每个订单类型配置完成后,生成数据的结构是
/** * 订单流程配置 **/@Datapublic class OrderFlowConfig implements Serializable {    /**     * 初始订单状态编码     **/    private String initStatus;    /**     * 每个订单状态下,可执行的操作及执行操作后的目标状态     * Map<原状态编码, Map<订单操作类型编码, 目标状态编码>>     */    private Map> operations;}
订单商品行状态机、售后单状态机,也用同样的方式实现3.3 通用操作触发器

(1)背景

业务中通常都会有这样的延时需求,我们之前往往通过定时任务来扫描处理。

下单后多久未支付,自动关闭订单申请退款后商家多久未审核,自动同意申请订单签收后多久未确认收货,自动确认收货

(2)目标

业务方有类似的延时需求时,能够有通用的方式轻松实现

(3)方案

设计通用操作触发器,具体步骤为:

配置触发器,粒度是状态机的流程类型。创建订单/售后单时或订单状态变化时,如果有满足条件的触发器,发送延迟消息。收到延迟消息后,再次判断执行条件,执行配置的操作。

触发器的配置包括:

注册时间:可选订单创建时,或订单状态变化时执行时间:可使用JsonPath表达式选取订单模型中的时间,并可叠加延迟时间注册条件:使用QLExpress配置,满足条件才注册执行条件:使用QLExpress配置,满足条件才执行操作执行的操作和参数3.4 分布式事务

对交易平台而言,分布式事务是一个经典问题,比如:

创建订单时,需要同时扣减库存、占用优惠券,取消订单时则需要进行回退。用户支付成功后,需要通知发货系统给用户发货。用户确认收货后,需要通知积分系统给用户发放购物奖励的积分。

我们是如何保证微服务架构下数据一致性的呢?首先要区分业务场景对一致性的要求。

(1)强一致性场景

比如订单创建和取消时对库存和优惠券系统的调用,如果不能保证强一致,可能导致库存超卖或优惠券重复使用。

对于强一致性场景,我们采用Seata的AT模式来处理,下面的示意图取自seata官方文档。

(2)最终一致性场景

比如支付成功后通知发货系统发货,确认收货后通知积分系统发放积分,只要保证能够通知成功即可,不需要同时成功同时失败。

对于最终一致性场景,我们采用的是本地消息表方案:在本地事务中将要执行的异步操作记录在消息表中,如果执行失败,可以通过定时任务来补偿。

3.5 高可用与安全设计熔断

使用Hystrix组件,对依赖的外部系统添加熔断保护,防止某个系统故障的影响扩大到整个分布式系统中。

限流

通过性能测试找出并解决性能瓶颈,掌握系统的吞吐量数据,为限流和熔断的配置提供参考。

并发锁

任何订单更新操作之前,会通过数据库行级锁加以限制,防止出现并发更新。

幂等性

所有接口均具备幂等性,上游调用我们接口如果出现超时之类的异常,可以放心重试。

网络隔离

只有极少数第三方接口可通过外网访问,且都有白名单、数据加密、签名验证等保护,内部系统交互使用内网域名和RPC接口。

监控和告警

通过配置日志平台的错误日志报警、调用链的服务分析告警,再加上公司各中间件和基础组件的监控告警功能,让我们能够能够第一时间发现系统异常。

3.6 其他考虑是否用领域驱动设计

考虑到团队非敏捷型组织架构,又缺少领域专家,因此没有采用

高峰期性能瓶颈问题

大促和推广期间,特别是爆款抢购时的流量可能会触发限流,导致部分用户被拒之门外。因为无法准确预估流量,难以提前扩容。

可以通过主动降级方案增加并发量,比如同步入库切为异步入库、db查询转为cache查询、只能查到最近半年的订单等。

考虑到业务复杂度和数据量级还处在初期,团队规模也难以支撑,这些设计有远期计划,但暂时还没做。(架构的合适性原则,杀鸡用牛刀,你愿意也行)。

四、总结与展望

我们在设计系统时并没有一味追求前沿技术和思想,面对问题时也不是直接采用业界主流的解决方案,而是根据团队和系统的实际状况来选取最合适的办法。好的系统不是在一开始就被大牛设计出来的,而是随着业务的发展和演进逐渐被迭代出来的。

目前交易平台已上线一年多,接入了三个业务方,系统运行平稳,公司内有交易/商品/库存等需求的新业务,以及存量业务在遇到系统瓶颈需要升级时,都可以复用这块能力。

上游业务方数量的增加和版本的迭代,对平台系统的需求源源不断,平台的功能得到逐渐完善,架构也在不断演进,我们正在将履约模块从交易平台中剥离出来,进一步解耦,为业务持续发展做好储备。

关键词:

世界今热点:vivo全球商城:电商交易平台设计

一、背景vivo官方商城经过了七年的迭代,从单体架构逐步演进到微服务架构,我们的开发团队沉淀了许多宝贵的技术与经验,对电商领域业务也有相

世界看热讯:一线珠江久侯 中国铁建·西派粤府全球首发 致敬世界广州

中国铁建地产华南2023年媒体私享会暨海珠项目案名发布会圆满结束

引领厨电低碳趋势,方太再获中国轻工业联合会科技进步一等奖

文|华商韬略吴苏4月11日,中国轻工业联合会科学技术奖颁奖典礼在厦门举行,方太“面向低碳环保的新一代厨电关键技术研发及产业化”成果获中国

当前简讯:【融中早报】马斯克暗中推进AIGC项目 软银计划大幅减持阿里巴巴

软银的抛售是在关键时刻进行的,该集团正计划对英国芯片设计商ARM进行大宗上市,以寻求从一系列失败的投资和前所未有的损失中恢复。本轮融资将

天天实时:京雄商高铁雄安枢纽工程首桩开钻

中国网讯(记者:郑亮 通讯员:张雍、朱啸龙)4月11日上午,在新建北京至雄安新区至商丘高速铁路雄安新区至商丘段雄安枢纽工程(以下简称:雄

天天速递!消防中队,大队,支队有什么区别(消防中队、大队、支队的区别)

消防中队、大队、支队的区别是:消防支队是地级市别的消防队,是正营级别的消防队。消防大队是县、区、开发区级别的消防队,是正连级别的消防

当前观察:苦荞麦产地在哪里(苦荞麦产地)

苦荞麦的产地主要有我国东北和西南地区,四川大凉山彝族自治州是其主要产地之一,目前世界多地均有种植。苦荞麦营养价值丰富,含有丰富的蛋白

澎湃新闻的背景是什么(澎湃新闻属于官方吗)

澎湃新闻是上海报业集团改革后公布的成果。澎湃新闻创办于2014年,结合互联网技术创新与新闻基本价值传承,通过图文、视频、VR、动画等全媒体

上市九年,初心不改,君乐宝奶粉以科学营养坚守品质初心

高质量发展是全面建设社会主义现代化国家的首要任务。强国路上,我国各领域的民族品牌既是高质量发展的重要象征,更是质量强国的内在支撑。

信用卡还不起每个月还10块可以不?还不起信用卡可以分期吗?

信用卡还不起每个月还10块可以不?信用卡若是欠款太多导致还不起,每个月只还十元钱是没太大用处的。当然,能还一点是一点,总比不还要好。

全球通讯!重庆高速投资实现“开门红” 一季度累计完成投资83亿元

4月13日,上游新闻记者从重庆高速集团获悉,重庆高速集团投资实现“开门红”,一季度累计完成投资83亿元。渝湘复线高速、巫云开高速等在建项目

深水规院:4月12日融资买入49.12万元,融资融券余额7269.33万元

4月12日,深水规院(301038)融资买入49 12万元,融资偿还86 01万元,融资净卖出36 88万元,融资余额7269 33万元。

什么是信用卡逾期?信用卡上门催收条件是什么意思?

什么是信用卡逾期?1、信用卡逾期是指信用卡的使用者没有在银行规定的还款日期偿还其使用的借款。2、如果信用卡逾期不还,可能会影响个人在

信用卡逾期银行说要上门是真的吗?信用卡上门催收条件是什么?

信用卡逾期银行说要上门是真的吗?信用卡逾期银行说要上门是真的。现在信用卡上门的催收态度还是很正常的,去你家的主要目的是了解一下你的

信用卡欠款多久成呆账?信用卡逾期变成呆账怎么处理还款?

信用卡欠款多久成呆账?如果信用卡逾期天数达到181天以上,经过银行多次催收无果,且无法联系上持卡人的情况下,银行就会将该笔欠款设为呆账

欠信用卡20万无力偿还怎么办?信用卡还不上了会被坐牢吗?

欠信用卡20万无力偿还怎么办?1、如果欠了信用卡的钱无力偿还,建议客户与银行友好协商,争取延长还款期限,还可以尝试申请停息挂账。如果尚

焦点!一季度金融数据出炉:M2同比增长12.7% 人民币贷款增加10.6万亿元

4月11日,人民银行发布2023年一季度金融统计数据报告和2023年3月社会融资规模存量统计数据报告。M2同比增长12.7%社融存量同比增长10%金融统计数据

环球头条:新一轮政策资助即将到账!青岛已累计拨出1.48亿元扶持标准化项目

日前,青岛市市场监督管理局组织召开2022年度标准化资助奖励项目专家评审会,来自标准化、科研、管理等方面的5名专家,根据《青岛市标准化资助

焦点快看:青岛商圈:摆出更强“阵容”扩消费

东扩西进线上线下“多点开花”,数字化升级打造新场景,“流量”变“留量”燃旺烟火气青岛商圈:摆出更强“阵容”扩消费崂山万象汇开业,青岛

第一季度:我国有效融资需求加快回升

一季度我国人民币贷款增加10.6万亿元,对实体经济发放的人民币贷款占同期社会融资规模的73.6%……最新出炉的首季金融统计数据亮点不少,呈

零跑汽车经销商“反水” 折射重压之下厂商关系

零跑汽车经销商“反水”折射重压之下厂商关系---零跑汽车“销量造假”风波持续发酵,涉事双方各执一词。4月11日,山东济南融创茂零跑店店长张

最新:3月份青岛市CPI同比上涨0.9%

12日下午,国家统计局青岛调查队公布2023年3月青岛市居民消费价格(CPI)情况。今年3月,青岛市CPI同比上涨0.9%,其中,食品价格同比上涨2.

世界今日报丨合肥市经开区高刘街道:“三注重”为发展党员选育“好苗”

专稿:近年来,合肥经开区高刘街道按照“控制总量、优化结构、提高质量、发挥作用”总要求,将严格标准、程序、责任贯穿党员发展工作全过程,

黄山市黄山区龙西社区:“三聚焦”赋能邻里党建新发展

专稿:近年来,黄山市黄山区龙西社区党委积极探索、勇于实践,实施邻里党建赋能行动,聚焦三个“着力点”,夯实邻里党建基础,激发邻里党组织

当前头条:强奸罪判多久?强奸罪的量刑标准是什么?强奸罪的构成条件是什么?

《刑法》第二百三十六条强奸罪以暴力、胁迫或者其他手段强奸妇女的,处三年以上十年以下有期徒刑。奸淫不满十四周岁的幼女的,以强奸论,从

即时看!破20日均线向上是什么意思?回踩10日均线什么意思?

破20日均线向上是什么意思?破20日均线向上指的是股价突破了20日均线,处于向上趋势。股价如果能够即时站稳于上就说明股价未来看涨,否则只

信用卡逾期40天额度会怎样?信用卡逾期10多天会怎么样?

信用卡逾期40天额度会怎样?逾期40天,银行可能会对信用卡进行降额,具体要看银行针对逾期的规定,各家银行的规定不太一样。信用卡逾期会在

信用卡逾期会一直涨利息吗?信用卡逾期多久就不用还了?

信用卡逾期会一直涨利息吗?信用卡只要逾期不还款,逾期的利息就会一直增加,并且逾期利息会按月收取复利。因此,为了避免逾期利息不断上涨

信用卡逾期目前无力偿还怎么办?信用卡被起诉的一般是什么人?

信用卡逾期目前无力偿还怎么办?1、如果我们实在无法偿还信用卡欠款,可以主动联系银行,询问欠款及利息金额并向银行说明目前的情况,表示自

信用卡5万以上逾期会怎么样?信用卡欠五万怎么申请延期呢?

信用卡5万以上逾期会怎么样?信用卡欠款5万以上,逾期不的,会产生以下的后果:1、高额利息和滞纳金(1)信用卡不还款持卡人将不再享受信用卡

综合资讯

+更多

热点资讯

+更多
放量滞涨是什么意思?高位放量滞涨意味着什么?
放量滞涨是什么意思?放量滞涨指的是股价上涨幅度不大,成交量却呈巨量。这样的走势一般都是多空双方博弈所形成的,看多的投资者在此买入, [详细]

Copyright @ 2008-2020  www.43710.com   All Right Reserved Powered by 财经情报网 版权所有

财经情报网   联系邮箱:562 66 29@qq.com

网站备案:沪ICP备2020036824号-12