国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
库存系统是电商商品管理的核心系统,本文主要介绍vivo商城库存中心发展历程、架构设计思路及应对各种业务场景的实践。
vivo商城原库存系统耦合在商品系统,考虑到相关业务逻辑复杂度越来越高,库存做了服务拆分,在可售库存管理的基础上新增了实物库存管理、秒杀库存、物流时效 、发货限制、分仓管理等功能,满足了商城库存相关业务需求。
根据vivo大电商的销售渠道与业务场景可以将库存业务架构分为3个层级:仓库层、调度层以及销售层。
仓库层对应实体仓库,包括自营仓库、顺丰仓等第三方仓库以及WMS系统、ERP系统等;调度层负责库存调度与订单发货管理;销售层包含多个服务终端,vivo官方商城、vivo门店、第三方电商分销渠道等。其分层结构如图所示:
本文探讨的vivo官方商城库存架构设计,从整个vivo大电商库存架构来看,vivo官方商城库存系统涉及销售层内部架构以及销售层与调度层的交互。
早期商城的库存冗余在各业务系统中,如可售库存在商品系统、活动库存在营销系统等,库存流转也只有扣减与释放,无法针对库存进行整合与业务创新,存在诸多限制:
不能进行精细化管理,库存未分层,无法针对实物库存、分仓策略、活动库存进行精细化管理。
基于上述限制与产品期望,21年库存系统完成初版架构设计,此后系统不断迭代完善,形成当前的系统架构:
库存系统提供两个核心能力:交易能力和库存管理。上层业务方可以调用提供的API完成库存查询、库存扣减等操作;管理台可以按成分仓策略、库存同步等操作。
预占库存:用户下单完成库存预占,仓储系统发货后释放预占库存,预占库存可以监控已下单未发货库存量。
分仓策略:仓库功能信息,仓库可发货区域、无实物库存后的备选仓库;订单根据收货地址对应优先发货的仓库,争取尽快发货尽早到货。
商品库存流转涉及两个主要操作:正向库存扣减、逆向库存回退,整套库存变更流程如下:
缺点是:库存有限的情况下,恶意下单占库存影响其他正常用户下单。比如说有100台手机,如果没有限制下单数量,这100个库存可能被一个用户恶意占用,导致其他用户无法购买。
缺点是:当支付订单数大于实际库存,会阻断部分用户支付,影响购物体验。比如说只有100台手机,但可能下了1000个订单,但有900个订单在支付时无法购买。
下单时扣减库存,但只保留一段时间(比如15分钟),保留时间段内未支付则释放库存,避免长时间占用库存。
库存回退基本流程:订单出库前用户申请退款,回退可售库存、回退预占库存、软删除扣减日志、增加回退日志;一旦商品出库,用户申请退货走处理机流程,可售库存和实物库存均不回退。
为了给用户更快的发货,我们采用的是分仓策略,即由最近的仓库(存在优先级)给用户发货;同时存在备选仓库,当所有仓库无实物库存时可走备选仓库。
地区限制:根据收货地址批量设置部分区域无法发货等规则,粒度到省市区维度。
时间限制:仓库的发货时效管理,包括每天的发货时段、大促发货时段、以及特殊情况下的停发时段。
根据用户收货地址,基于分仓策略确定发货地址,再基于发货时效确定发货时间,提升用户体验。
订单重复提交会导致库存重复扣减,比如用户误提交、系统超时重试等,针对此类问题有如下常见解决方案:
注:对于按钮置灰这种方案,可以减少用户误触重复提交的可能性,但不能从根本上解决库存被重复扣减的问题,比如通过脚本来刷扣减库存的接口,依旧造成库存的重复扣减。
注:保证接口幂等的方案有很多,比如每次扣减库存时,带上唯一的流水号,利用数据库的唯一索引保证幂等等。
注:这种方案保证每次提交的订单是唯一的,如果用户多次下单,那么会产生多个订单。
在库存扣减接口入参中增加订单序列号作为唯一标识,库存扣减时增加一条扣减日志。当接口重复请求时,会优先校验是否已经存在扣减记录,如果已存在则直接返回,避免重复扣减问题,具体流程如下:
直接数据库扣减。通过sql判断剩余库存是否大于等于待扣库存,满足则扣减库存。该方案利用乐观锁原理即update的排他性确保事务性,避免超卖。
对于常规渠道,库存扣减是后置逻辑,流量不高,我们采用的是直接数据库扣减,且针对弊端做了一些措施:
前置校验严格,同时针对刷单场景会有严格限流,保证最终扣减库存的流量可控;
针对高并发库存扣减,比如秒杀,一般采用的是缓存扣减库存的方式(redis+lua脚本实现单线程库存更新)作为前置流程,代替数据库直接更新。
在redis中扣减库存虽然性能高,可以大大减轻数据库压力,但需要保证缓存数据能完整、正确的入库,以保证最终一致性。
对于疑问1:由于数据库insert比update性能优,insert是在表的末尾直接插入,没有寻址的过程,可以保证性能比较快。
对于疑问2:方案2不同于缓存直接扣减,而是把缓存扣减放在数据库insert的事务内,通过数据库的事务保证整体的事务。
insert的表被称为库存任务表,其中保存了库存扣减的信息,库存任务表结构可以设计的非常简单,主键 + 库存信息(json字符串)就可以了。
后续通过异步任务,从库存任务表表中查询出库存更新信息,将其同步到具体的库存表中,实现最终一致性,这种方案可以避免数据的丢失。
对于疑问3:库存回退是根据业务库中扣减记录进行回退的,由于异步更新业务库必定存在延迟(延迟极低,数秒以内),所以极端场景会存在走退款逆向流程时业务库的库存扣减记录还未更新。
针对这种情况库存回退设置延迟重试机制,如果再极端点达到重试阈值依旧没有扣减记录,则返退成功,不做阻断。
目前我们针对秒杀库存扣减,采用的是方案2。但毕竟涉及数据库的更新,为了避免风险,在前置流量校验上做了限制,保证流量的可控:
什么是热点问题?热点问题就是因热点商品导致的redis、数据库等性能瓶颈。在库存系统中,热点问题主要存在:
采用直接扣减库存数据库的方式,存在数据库的行锁问题。常规渠道的库存扣减,我们采用的就是的就是这种方式。
采用缓存扣减库存的方式,大流量的情况下,热点商品扣减库存操作会打向redis单片,造成单片性能抖动,从而出现redis性能瓶颈。
对于第1种热点问题,在vivo商城常见的场景是:新发的爆品手机,在准点售卖时会有抢购效应,容易造成库存数据库单行的瓶颈问题。针对这种热点问题,我们的解决方案是“分而治之”:
对于潜在的热点爆款手机,我们会将库存平均分为多行(比如M行),扣减库存时,随机在M行中选取一行库存数据进行扣减。该方案突破了数据库单行锁的瓶颈限制,解决了爆款商品的热点问题。
对于第2种redis单片热点问题,解决方案也是分而治之。将数据库中的库存数据同步到redis时,把key值打散,分散在多个redis单片中。注:我们目前线上的流量峰值还达不到会造成redis单片瓶颈的问题,为避免过度设计,只做了前置限流,没有进行key值的打散。
实物库存同步,对接的是仓储系统,通过接口来获取商品的实际库存。实物库存同步分成两种:定时全量同步、指定单品更新。
由于库存系统多个场景涉及库存变更,运营手动编辑、用户下单退款导致库存扣减回退,还有商品系统内编辑库存数据也会导致库存变更(以前库存系统未独立,库存数据维护在商品系统)。同时很多业务在查询库存时,参考的依旧是商品系统的库存数据。
这里有一个问题:库存系统已经独立出来,为什么还会依赖商品系统的库存数据?
商城多个业务的后台有商品筛选的需要,商品筛选会有库存数量的筛选项。商品数量很多,筛选是分页的,如果将库存数据全部替换成库存系统的,那么存在跨系统分页问题,分页筛选会存在问题;
历史遗留问题,很多业务方依赖的是商品系统的库存数据(包括依赖商品库存离线表的业务方),全部切换到库存系统,成本和影响范围大。
库存变更场景多,为了降低业务复杂度、采用简单的方式实现库存同步,我们利用了团队自研的CDC系统(鲁班平台),整体流程如下:
库存数据库发生变更后,鲁班平台通过binlog采集获取库存变更日志,再通过自定义规则筛选,然后发送mq变更消息,最后商品系统消费消息完成库存同步变更。
库存系统完成服务拆分,在单一的可售库存扣减功能基础上拓展了很多功能,赋能业务的发展。
针对库存扣减防重、高并发场景下的库存扣减、库存热点问题、库存同步等技术问题,我们根据业务实际情况设计合理方案。
目前vivo商城库存系统平台化能力不足,部分能力分散在其他系统中,未来我们希望能为vivo新零售提供一体化的库存管理方案。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。举报投诉
计的意义(1)应用代码逻辑清晰,且避免代码冗余;(2)代码通用性,方便软件高速、有效的移植;(3)各功能独立,低耦合高内聚;2、总体
视频 java私塾推出的项目视频,感觉很不错,其中需求分析,
计很合理。对正在做毕业设计的同学有很大帮助。课程大纲: &
师也是电子人不错的选择) ROCE(儒仕),用心为每一位电子人!Xilinx7系列普及讲座,
师设计方案模板,交流学习 内容请下载附件pdf,更多内容请登录/div
使用WEBENCH® FPGA Power Architect 设计工具,进行FPGA的电源
【WEBENCH 大赛作品】WEBENCH Processor Power Architect 电源
利用WEBENCH Processor Power Architect 设计工具进行设计,基于TPS54335A原件的电源
可以提高仓储效率、降低人工成本、实现物料消耗情况等关键数据实时监控和可视化管理,可以在
计—实现安卓热修复回复即可获取下载链接[hide=d15]链接:密码:iw16 学习群:150923287 [/hide]
计软件——PREEvision(盗版),价格可议,WetChat/***,非诚勿扰
不稳定,调试问题不收敛。磨刀不误砍柴工,FPGA设计的需求分析是整个设计第一步。如何将
计特权同学,版权所有配套例程和更多资料下载链接:如图2.8所示,FPGA核心板电路
的累积;400家全球优质供应商的原厂资源;倾力打造的安全快捷的在线采购
的累积;400家全球优质供应商的原厂资源;倾力打造的安全快捷的在线采购
计清晰。Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native
可以提高仓储效率、降低人工成本、实现物料消耗情况等关键数据实时监控和可视化管理,可以在
提升巨大,也让配备 M1 芯片的 Mac 跨入完全不同的层次。由于M1芯片是基于ARM
计,所以无法安装x86版本的Windows。著名的虚拟机软件parallels desktop推出了基于m1
、数据防泄漏技术、基于大数据的网络安全和应用安全检测技术等研究和产品设计。 文章内容来源 第一届开放原子开源
计,采用亚米级高精度定位方案,高集成 4G 全网通,将为用户带来更丰富的智能体验。
通常要定义以下几个元素:1.模块需要实现所需的功能,当然,这些模块也可以
规模都较小,一般是为了某些特定的目的而设计的。受工程师认识,客户规模和项目进度的影响,经常不做任何
应当满足当前需求并适当的考虑重用和变更1.2 敏捷开发不需要框架 极限编程, 敏捷开发的出现使一些人误以为软件开发无需再做
了。 这是一个很大的误解。 敏捷开发是在传统瀑布式开发流程出现明显弊端后提出的解决方案, 所以它必然有一个更高的起...
计的目的1.应用的代码逻辑清晰,且避免重复造轮子。2.方便软件的移植。3.最大限度地复用。4.高内聚低耦合。 【2】嵌入式
了一下,还是有些感悟。又参考了一些文档,觉得还是要记录一下,最近整理代码的心得。整理
作为程序员,我觉得如果要走的更远必须要成为工程师,毕竟年龄和资历都摆在那里了。所以就让我这个老程序员浅谈一下嵌入式软件
计。我参考的也是一篇博文。原图如下![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,s...
简介今天可以使用的高集成度先进射频设计可让工程师设计出性能水平超过以往的RF
计师(Memory方向)【岗位职责】1.主责memory产品模拟电路设计,尤其是NVM、flash模拟电路设计;2.根据客户需求定义
本文是机甲大师机器人控制的系列博客之一。在功能分析的基础上,本文设计软件的
设计人员的规划蓝图而已,但这一局面正迅速得到改观。随着3G无线业务的日趋临近,设计人员又对在基础
的介绍, 建设 overlay 时遇到的挑战, 以及基于 overlay 的产品.在不久前
的介绍, 建设 overlay 时遇到的挑战, 以及基于 overlay 的产品.在不久前
计和小线径化 用 “复杂”来形容当今的汽车是再恰当不过的一个词。安全、操控、驱动和娱乐仅仅是依赖电子/电气
计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是
中去体会。这篇文章主要介绍面向对象OO、面向方面AOP和面向服务SOA这三个要素在
本文参考ISO26262的要求,同时考虑AUTOSAR代码生成的兼容性,给出使用Simulink实现软件
计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是
中去体会。这篇文章主要介绍面向对象OO、面向方面AOP和面向服务SOA这三个要素在
计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是
中去体会。这篇文章主要介绍面向对象OO、面向方面AOP和面向服务SOA这三个要素在
之一,它贯穿苏宁的整个业务价值链条,不论从采购线的采购、交货、调拨、退场、入库过账、实物盘点等环节,还是销售线的浏览、下单、发货、出库过账等环节,再到客服支撑、经营分析报表、预测补货、多平台销售支撑等大数据应用,都和
计方法。通过整车需求定义、原子逻辑单元搭建实现整车功能逻辑的实体化,然后利用模型设计分析方法,将功能需求分配到各个电子控制单元,利用
计和TSC当我们开始写TSC时,会涉及到下图中一系列的内容:当我们完成前三期(链接见文末)提到的安全机制规范后,我们就要开始整理好所有的安全需求并在
孙玄,江湖人称“玄姐”,前58集团技术委员会主席,前转转二手交易平台首席
计,识别哪些软件需求应该分配给软件的哪些要素,并根据已定义的标准评估软件
计和原理细节,一来向外界讲讲深度这么多年都做了哪些工作,二来希望通过客观公正的事实向中国新一代的开源爱好者讲述怎么用正确的三观去贡献自己的力量
计的意义(1)应用代码逻辑清晰,且避免代码冗余;(2)代码通用性,方便软件高速、有效的移植;(3)各功能独立,低耦合高内聚;2、总体
计的一座高峰,很多人经常听过它,但很少人理解其中的原理。 异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的? 这些疑问
的实现方案越来越复杂。同时随着设计约束条件越来越苛刻,传统依靠经验来指定设计规格的方式,导致项目设计变得愈发棘手。此时,最需要的是一个可以对电子
的硬件、软件实现方案进行快速分析与优化的设计平台,这就是Genesis芯神匠
计中的控制器融合提供了分析方法和参考案例;应用结果表明,该分析方法可有效提高电子电气
计是一个非常微妙的设计领域,它是完全建立在形而上的逻辑上的,它是抽象的,非具象的。但这种抽象必须要以可以实施为底线,否则就沦为纸上谈兵了。
计,识别哪些软件需求应该分配给软件的哪些要素,并根据已定义的标准评估软件
在计算领域,GPU(图形处理单元)一直是性能飞跃的代表。众所周知,高端GPU的设计充满了挑战。GPU的
创新,为软件承接大模型训练和推理场景的人工智能计算提供了持续提升的硬件基础。GPU
计和研发工作都由我负责,涉及到Android、QNX、Hypervisor等
方法基础上,博采众家之长,融合基于职能的业务能力分析与基于价值的端到端流程分析,将”传统
*请认真填写需求信息,我们会在24小时内与您取得联系。