商城库存系统中心架构设计与实践案例嵌入式技术

本文将介绍vivo商城库存系统架构设计经验以及一些问题的解决方案。

二、系统架构设计

2.1vivo大电商库存架构

根据vivo大电商的销售渠道与业务场景可以将库存业务架构分为3个层级:仓库层、调度层以及销售层。

仓库层对应实体仓库,包括自营仓库、顺丰仓等第三方仓库以及WMS系统、ERP系统等;调度层负责库存调度与订单发货管理;销售层包含多个服务终端,vivo官方商城、vivo门店、第三方电商分销渠道等。其分层结构如图所示:

本文探讨的vivo官方商城库存架构设计,从整个vivo大电商库存架构来看,vivo官方商城库存系统涉及销售层内部架构以及销售层与调度层的交互。

2.2商城库存系统架构演变

早期商城的库存冗余在各业务系统中,如可售库存在商品系统、活动库存在营销系统等,库存流转也只有扣减与释放,无法针对库存进行整合与业务创新,存在诸多限制:

不能进行精细化管理,库存未分层,无法针对实物库存、分仓策略、活动库存进行精细化管理。

没有分仓策略,无法提前获取商品收发地址,物流时效无法估算。

无法针对地区、商品等进行发货管控。

实时性差,无法及时同步实物库存以及分仓策略。

性能弱,与其他系统耦合大,不能灵活扩展。

三、系统业务架构

3.1库存类型&分仓管理

3.1.1库存类型结构

库存系统一共包含4类库存:可售库存、实物库存、预占库存、活动库存。

可售库存:运营配置的普通商品库存,商品维度到SKU。

实物库存:由仓储系统同步到库存系统的实物库存,细化到具体仓库。

预占库存:用户下单完成库存预占,仓储系统发货后释放预占库存,预占库存可以监控已下单未发货库存量。

活动库存:用于秒杀、抢购等各类营销活动的商品库存。

基于不同类型库存,可以构建一个简单的库存分层体系:

3.1.2分仓管理

仓库信息:仓库基础信息,包括仓库地址、类型、编码等。

分仓策略:仓库功能信息,仓库可发货区域、无实物库存后的备选仓库;订单根据收货地址对应优先发货的仓库,争取尽快发货尽早到货。

仓库库存:仓库实物库存,由仓库调度系统同步到商城库存系统。

3.2商城库存流转方案

商品库存流转涉及两个主要操作:正向库存扣减、逆向库存回退,整套库存变更流程如下:

3.2.1正向库存扣减流程

对于库存扣减,目前常见有两种库存扣减方案:

(1)下单时扣库存。

优点是:实时扣库存,避免付款时因库存不足而阻断影响用户体验。

(2)支付时扣库存。

优点是:不受恶意下单影响。

缺点是:当支付订单数大于实际库存,会阻断部分用户支付,影响购物体验。比如说只有100台手机,但可能下了1000个订单,但有900个订单在支付时无法购买。

从用户体验考虑,我们采用的是下单时扣库存+回退这种方案。

3.2.2逆向库存回退流程

库存回退基于库存变更日志逐个回退。

库存回退基本流程:订单出库前用户申请退款,回退可售库存、回退预占库存、软删除扣减日志、增加回退日志;一旦商品出库,用户申请退货走处理机流程,可售库存和实物库存均不回退。

3.3精细化发货管控

库存系统还提供了一系列定制辅助功能:分仓策略、发货限制、物流时效等等。

(1)分仓策略

为了给用户更快的发货,我们采用的是分仓策略,即由最近的仓库(存在优先级)给用户发货;同时存在备选仓库,当所有仓库无实物库存时可走备选仓库。

3.3.1发货限制

地区限制:根据收货地址批量设置部分区域无法发货等规则,粒度到省市区维度。

3.3.2物流时效预估

四、系统架构技术要点

4.1库存扣减防重

订单重复提交会导致库存重复扣减,比如用户误提交、系统超时重试等,针对此类问题有如下常见解决方案:

订单提交按钮单击置灰,避免重复提交。

保证库存扣减接口的幂等性。

采用令牌机制。用户提交订单会进行令牌校验,校验通过才能提交订单。

注:这种方案保证每次提交的订单是唯一的,如果用户多次下单,那么会产生多个订单。

本系统采用的是保证接口幂等性的方案。

在库存扣减接口入参中增加订单序列号作为唯一标识,库存扣减时增加一条扣减日志。当接口重复请求时,会优先校验是否已经存在扣减记录,如果已存在则直接返回,避免重复扣减问题,具体流程如下:

4.2防超卖与高并发扣减方案

4.2.1常规渠道防超卖方案

常规下单渠道流量小且对超卖风险厌恶度极高,常用的防超卖方案有:

方案一:

直接数据库扣减。通过sql判断剩余库存是否大于等于待扣库存,满足则扣减库存。该方案利用乐观锁原理即update的排他性确保事务性,避免超卖。

伪代码sql:

该方案的优点是:

实库实扣,不会出现超卖;

数据库乐观锁保证并发扣减一致性;

数据库事务保证批量扣减正常回滚。

该方案的缺点是:

行级锁的原因存在性能瓶颈,高并发会出现请求堵塞超时问题;

直连数据库,每次扣库存都是写操作,接口性能较低。

方案二:

利用分布式锁,强制串行化扣减同一商品库存。

减轻数据库压力,同时还能确保不会超卖。

每次只能有一个请求抢占锁,不能应对高并发场景。

对于常规渠道,库存扣减是后置逻辑,流量不高,我们采用的是直接数据库扣减,且针对弊端做了一些措施:

前置校验严格,同时针对刷单场景会有严格限流,保证最终扣减库存的流量可控;

库存系统读写分离,减少数据库的压力。

4.2.2高并发库存扣减方案

针对高并发库存扣减,比如秒杀,一般采用的是缓存扣减库存的方式(redis+lua脚本实现单线程库存更新)作为前置流程,代替数据库直接更新。

在redis中扣减库存虽然性能高,可以大大减轻数据库压力,但需要保证缓存数据能完整、正确的入库,以保证最终一致性。

针对缓存数据更新至数据库,目前主流方案有两种:

方案一:Redis数据直接异步更新至数据库。

优点:简单、没有复杂的流程。

缺陷:redis宕机或者故障,可能会造成缓存内库存数据的丢失。

方案二:Redis扣减库存时,同步在业务数据中insert库存信息。

这里大家可能会有两个疑问:

有数据库的插入操作,性能怎么保证?

有数据库的操作,又有redis的更新,事务性怎么保证?

异步更新业务库存在延迟,库存逆向回退如何保证?

对于疑问1:由于数据库insert比update性能优,insert是在表的末尾直接插入,没有寻址的过程,可以保证性能比较快。

对于疑问2:方案2不同于缓存直接扣减,而是把缓存扣减放在数据库insert的事务内,通过数据库的事务保证整体的事务。

insert的表被称为库存任务表,其中保存了库存扣减的信息,库存任务表结构可以设计的非常简单,主键+库存信息(json字符串)就可以了。

后续通过异步任务,从库存任务表表中查询出库存更新信息,将其同步到具体的库存表中,实现最终一致性,这种方案可以避免数据的丢失。

对于疑问3:库存回退是根据业务库中扣减记录进行回退的,由于异步更新业务库必定存在延迟(延迟极低,数秒以内),所以极端场景会存在走退款逆向流程时业务库的库存扣减记录还未更新。

针对这种情况库存回退设置延迟重试机制,如果再极端点达到重试阈值依旧没有扣减记录,则返回回退成功,不做阻断。

目前我们针对秒杀库存扣减,采用的是方案2。但毕竟涉及数据库的更新,为了避免风险,在前置流量校验上做了限制,保证流量的可控:

4.2.3库存热点问题

什么是热点问题?热点问题就是因热点商品导致的redis、数据库等性能瓶颈。在库存系统中,热点问题主要存在:

采用直接扣减库存数据库的方式,存在数据库的行锁问题。常规渠道的库存扣减,我们采用的就是的就是这种方式。

采用缓存扣减库存的方式,大流量的情况下,热点商品扣减库存操作会打向redis单片,造成单片性能抖动,从而出现redis性能瓶颈。

对于第1种热点问题,在vivo商城常见的场景是:新发的爆品手机,在准点售卖时会有抢购效应,容易造成库存数据库单行的瓶颈问题。针对这种热点问题,我们的解决方案是“分而治之”:

对于潜在的热点爆款手机,我们会将库存平均分为多行(比如M行),扣减库存时,随机在M行中选取一行库存数据进行扣减。该方案突破了数据库单行锁的瓶颈限制,解决了爆款商品的热点问题。

对于第2种redis单片热点问题,解决方案也是分而治之。将数据库中的库存数据同步到redis时,把key值打散,分散在多个redis单片中。注:我们目前线上的流量峰值还达不到会造成redis单片瓶颈的问题,为避免过度设计,只做了前置限流,没有进行key值的打散。

4.3库存同步方案

库存系统存在一些库存同步场景:

对接仓储系统,完成实物库存同步。

兼容历史架构,商品系统库存的可售库存同步等。

(1)实物库存同步:

实物库存同步,对接的是仓储系统,通过接口来获取商品的实际库存。实物库存同步分成两种:定时全量同步、指定单品更新。

定时全量同步:每天定时全量拉取库存调度平台的实物库存进行全量同步。

制定单品:运营也可以手动触发单个sku的商品即时同步实物库存。

(2)商品系统库存同步:

由于库存系统多个场景涉及库存变更,运营手动编辑、用户下单退款导致库存扣减回退,还有商品系统内编辑库存数据也会导致库存变更(以前库存系统未独立,库存数据维护在商品系统)。同时很多业务在查询库存时,参考的依旧是商品系统的库存数据。

这里有一个问题:库存系统已经独立出来,为什么还会依赖商品系统的库存数据?

这有两点原因:

商城多个业务的后台有商品筛选的需要,商品筛选会有库存数量的筛选项。商品数量很多,筛选是分页的,如果将库存数据全部替换成库存系统的,那么存在跨系统分页问题,分页筛选会存在问题;

历史遗留问题,很多业务方依赖的是商品系统的库存数据(包括依赖商品库存离线表的业务方),全部切换到库存系统,成本和影响范围大。

因此,我们需要保证商品系统和库存系统两边库存数据的一致。

库存数据库发生变更后,鲁班平台通过binlog采集获取库存变更日志,再通过自定义规则筛选,然后发送mq变更消息,最后商品系统消费消息完成库存同步变更。

五、总结及展望

最后对库存系统进行一个总结:

库存系统完成服务拆分,在单一的可售库存扣减功能基础上拓展了很多功能,赋能业务的发展。

完成库存架构分层,抽象多个库存类型,更灵活地满足当前业务需求。

针对库存扣减防重、高并发场景下的库存扣减、库存热点问题、库存同步等技术问题,我们根据业务实际情况设计合理方案。

展望

目前vivo商城库存系统平台化能力不足,部分能力分散在其他系统中,未来我们希望能为vivo新零售提供一体化的库存管理方案。

THE END
1....需要开发一个信息化管理系统。请根据公司现有业务及需求完成该...【答案解析】试题二(共15分)阅读下列说明,回答问题1至问题3;将解答填入答题纸的对应栏内。【说明】某销售公司当前的销售业务为商城实体店销售。现该公司拟开展网络销售业务,需要开发一个信息化管理系统。请根据公司现有业务及需求完成该系统的数据库设计。【需求描述】https://www.cnitpm.com/st/2536417073.html
2.软件工程题库第四章概要设计7.(单选题)软件结构图能描述软件系统的总体结构,它应在软件开发的( )阶段提出。 A. 需求分析 B. 概要设计 C. 详细设计 D. 代码编写 正确答案: B:概要设计; 8.(单选题)耦合是软件各个模块之间连接的一种度量。一组模块都访问同一数据结构应属于( )方式。 https://developer.aliyun.com/article/1279317
1.电子商务购物商城系统设计与实现电子商务购物商城系统设计与实现 本文还有配套的精品资源,点击获取 简介:本项目为在线购物平台,核心功能包括用户注册与登录、购物车管理以及支付流程。用户注册和登录模块收集并验证用户信息,购物车允许用户临时存储并管理商品,支付功能支持多种支付方式并确保交易安全。项目涵盖前端界面构建、后端服务开发、数据库管理,并...https://blog.csdn.net/weixin_35749545/article/details/141732536
2.商城系统建立:实战经验与深度解析商城系统的建立是一个系统工程,需要技术、设计、运营等多方面的协同努力。通过精准规划、匠心实现、卓越体验与智慧运营,我们可以打造出一个既满足用户需求又具备市场竞争力的商城系统。在这个过程中,不断学习与创新是我们前行的动力。 原文地址:https://www.batmanit.cn/blog/j/28317.html...https://www.batmanit.cn/blog/j/28317.html
3.京东(JD.COM)京东JD.COM-专业的综合网上购物商城,为您提供正品低价的购物选择、优质便捷的服务体验。商品来自全球数十万品牌商家,囊括家电、手机、电脑、服装、居家、母婴、美妆、个护、食品、生鲜等丰富品类,满足各种购物需求。https://www.jd.com/
4.准备好了吗?KindleFireHD7国行评测(全文)那么如果算上“购物”标签在内的话,国行版的Kindle Fire HD就是有三个市场可以使用,但实际上点击“购物”这个标签后后呈现给我们的就是一个布局经过调整的亚马逊商城界面,但又不同于我们在Android系统以及iOS上使用的同名的APP应用。 ■亚马逊应用商店 https://pad.zol.com.cn/379/3791179_all.html
5.经营管理创新范文12篇(全文)服务管理工作是一项全面而系统的工作,强化和创新的过程必然要求所有与之相关的部门通力合作,全面调整,为一线经营活动提供系统化的强力支持。燕莎商城全面创新服务管理工作还体现在以下三个方面: 一是提高技术,发挥信息系统强有力的支撑作用。燕莎商城发挥CRM系统管理优势,分期实施系统运行工作,逐步对顾客信息进行深加工处理...https://www.99xueshu.com/w/ikeykpg3xdrw.html
6.万字拆解!樊登读书产品设计全方位深度解析优设网从讲书人去拆分,樊登读书设计了樊登讲书(火车头)、李蕾讲经典(前央视主持人,自带流量和曝光度)和非凡精读(汇聚各行业精英大咖)三个版块。从知识学习的场景拆分,樊登读书设计了「课程」和「书城」两大版块,如今的樊登读书,已经成为一个非常丰富的知识付费学习平台,不仅有各种知识付费、职业培训课程,还有训练营、系统...https://www.uisdc.com/fandeng-read
7....新零售系统免费多商户B2B2C单商户B2C系统5、选择一个品牌,点击搜索,结果显示错误 6、PC端无法跳转外链 7、PC端商品详情,切换规格,主图变空白,规格展示样式重叠 8、PC端商品列表,分类样式错乱 9、PC端待付款订单,支付金额为0时,跳转页面错误 10、下级分销商查不到二级分销商信息 11、分销邀请好友不显示 ...https://www.niushop.com/web/developplan/index.html
8.商城数据库表设计介绍大数据Lansonli的技术博客一个商城系统,需要有,用户表,商品表,商品分类表,购物车表,订单表,订单明细表,支付信息表,以及物流信息表。 使用PowerDesigner对数据表以及他们之间的关系进行了粗略的设计得出了如下E-R图: 1.用户表 2. 商品表 3.商品类别表 4.购物车表 5. 订单表 ...https://blog.51cto.com/lansonli/5284061
9.Java毕业设计实战之二手书商城系统的实现javaJava毕业设计实战之二手书商城系统的实现更新时间:2022年01月26日 15:15:08 作者:OldWinePot 这是一个使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP开发的二手书商城系统,是一个毕业设计的实战练习,具有在线书城该有的所有功能,感兴趣的朋友快来看看吧...https://www.jb51.net/article/235992.htm
10.销售工作计划(精选15篇)1)在终端进行宣传,应以提高“注目率”为基点,即将在终端光临的顾客的目光先吸引过来,买不买“x红酒”是另外的一回事,先让其看一眼“x红酒”,如在卖场酒类专卖区林林总总的酒产品陈列架前,如何吸引顾客的目光,除了现场促销员的解说外,另外一条途径就是在终端陈列上做文章,我们设计一个精巧的,能体现出“x红酒...https://www.unjs.com/fanwenwang/gzjh/20220616124405_5193151.html
11.WordPress主题WordPress企业主题WordPress商城主题高品质...萨龙网络助力个人和企业选择优秀的WordPress主题,WordPress模板,WordPress 企业主题,WordPress商城主题,WooCommerce主题,让建站更简单。并专注WordPress高端主题设计与开发,为您提供一个现代、干净的WEB站点https://salongweb.com/
12.降管理方案15篇健康服务平台是一个实现了健康信息采集、疾病风险评估和健康指导干预的全信息化模式的互联网健康服务平台。每一位注册会员都可以拥有免费的个人健康主页,享受包括信息采集、健康测评、风险评估、健康指导和风险因素干预在内的健康服务。 2. 健康服务平台(HSP)系统设计方案 ...https://www.oh100.com/a/202304/6550012.html