[原创]商城系统下单库存管控系列杂记(一)(并发安全和性能基础认识)

商城系统下单库存管控系列杂记(一)(并发安全和性能基础认识)

前言

参与过几个中小型商城系统的开发,随着时间的增长,以及对系统的深入研究和测试,发现确实有很多值得推敲和商榷的地方(总有很多重要细节存在缺陷)。基于商城系统,无论规模大小,或者本身是否分布架构,个人觉得最核心的一环就是下单模块,而这里面更相关和棘手的一些设计和问题,大多时候都涉及库存系统。想想之前跟某人的交流,他一句“库存管控做得好,系统设计就成功了一半”,自己颇有认同。围绕这个点,结合目前经验和朋友间的交流(包括近来参阅其他文章提到的点),闲来做些整理记录,也许不太完整,但总归希望能有更多启发,自己往后也会重新揣摩。当然,文中若有不妥,欢迎指正。

正文

谈及”下单“,就立刻想起前年参与的一个基于微信的小型商城系统,里面下单这块本身谈不上复杂,大概可以这样描述提交过程:用户提交商品订单,系统核对用户提交的订单,校验商品(商品价格、优惠折扣、积分等),检测附属信息(地址运费等),一切Pass,操作库存(记录/预扣),生成订单及相关联的明细数据。此时下单Ok,那么后续则是等待用户的及时付款了。

然而,看似如此简单的一个流程,放在并发环境下,就暴露了足够多的问题。深入进去,首当其冲的就是库存管控。包括但不限于库存的扣减方式,如何安全操作,以及减少性能损耗等等。

一、简单提一提通常的库存扣除时机选择:“下单减库存”和“付款减库存”

首先表明个人观点,在大多数业务场景下,个人相对倾向前者——“下单减库存”。后续大部分解决方案的论述,也都是以这个为主要前提展开。当然,针对去年参与的某微信商城系统(之后用“AutumnBing”作为项目代号),两种是同时实现的 ——— 商户可以在管理后台,指定某商品的库存扣减方式。

两者在应用上的一些细节区别:

1.1  下单减库存:

用户下单时,后台进行预扣库存,当前用户体验不错。但当前用户若迟迟未付款,这种“吊单”就造成库存浪费,影响商户利益,同时也影响了其他用户的需求购物(除非,能做好一定风控和库存回滚,后续会有阐述,也是我更倾向的)。

1.2  付款减库存:

用户下单后过了几秒,进行在线支付,结果付款成功了,却发现库存已经不足,导致购物失败,严重影响购物体验。同时,还要考虑扣款的回退造成更多复杂性(除非,允许一定超卖,或者库存数量“不计” ,另外倘若是秒杀场景,则依然是无法应付)。

二、描述下非并发情况下,针对库存预扣的(其中)一种抽象流程

2.1

用户选择 商品P * 数量N,并提交订单,系统后台核心API接口 如SubmitOrder,进行接收处理。

2.1.1

在SubmitOrder中,假定商品P的库存足够,将对应商品规格的库存 -N。

2.1.2

在SubmitOrder中,倘若商品P的库存已经不足够,告知下单失败及原因。

2.2

订单付款设置有一定的时效,为M分钟。

2.2.1

在M分钟内,可以正常付款并流转后续服务。

2.2.2

超过M分钟,则当前订单自动处理为过期(或者直接Close),并将商品P的库存 +N,从而恢复库存。

2.3

用户取消订单,类似2.2.2,直接将当前订单状态改为取消(或者直接Close),并将商品P的库存 +N,从而恢复库存。

2.4

用户申请退款

2.4.1

未发货,可以直接申请退款,同时将商品P的库存 +N,从而恢复库存(Tips:某些极少数现存项目里,存在发货后才减库存的设计,那么无需补足,但这里不对比论述,否则本流程也会相应调整,也非重点)。

2.4.2

已发货,可以直接申请退款,但需要发回商品,等待相关处理(手动重新上架,或者补充商品P库存)。

三、额外说明,在不考虑并发情况,库存风险管控上的一些附属问题

商品P若被大量下单,这些订单中又存在相当大比例的未支付,此时商品P的库存会被瞬间清空,必定就需要针对这块的风控检测。(PS:其实这不是本文阐述的主要方向,但最近刚好在其他平台看到几篇相关的文章中有简单提到以下几点,既然有一定的关联性,本人就结合目前的想法,就尽量先抛出来,但不做过多延伸)。

3.1 商品P被同一用户刻意反复下单(非并发造成):

可采取在SubmitOrder之前,设置用户限购以及关联商品P的订单待支付核查。同时提供备用的手动黑名单机制。

3.2 商品P被同一IP的多个用户刷单:

这种情况,首先就有系统的分级检测风控,譬如第一级是设置验证码(针对用户),第二级是已购买检测(类似3.1),第三级是库存阈值报警通知(针对商家),第三级是黑名单拦截(程序拦截和手动拦截)等。其实这在“AutumnBing”项目里并未用到,而截止目前,本人身边也只有一位朋友提到了相关实际应用,并且是相对简单粗糙的实现,毕竟这块程序上能做的只是辅助。

3.3 商品P被不同IP的用户恶意下单:

比如某些竞争对手非法发起的有网络组织进行团体性恶意拍单,这种类似“DDOS”的洪流(条件类似)已经上升到了另外的高度上去了。除了结合上面的一些辅助手段,目前没有见过或者听过有效的处理方式。但值得一提的是,和DDOS场景本身不同的地方,如果这些用户账号不停下单,却未履约,那么会受到一些冻结处罚(配合时效),这会使得恶意攻击的成本更高 。

四、阐述关于并发环境中库存管控的一些案例问题,以及涉及到的相关技术实现细节

库存扣减,简单来说,就是在对应的存储器中(数据库或者持久缓存)将对应商品的数量减少。

数据库设计时,一般包含但不限于 商品主表,商品规格表,商品库存表,商品库存流水日志表等等。但这里为了方便后续阐述,将其简化为一张表——商品表(PT),该表仅包含两个字段——商品主键(id)和商品库存(qty )。

依然以商品P举例,其主键为pid,那么就是在下单时,将历史库存S修改为 S -N。具体到SQL里,原始操作大概是这样(以SQL SERVER 举例):

update PT set qty = (S - N) where id = pid ;

这是以前的最原始的操作方式,单粒度的看,也没什么大碍。然而,放在一个并发环境中,则立马暴露出诸多问题。

假定在同一时刻,有两个用户提交了订单,一样的操作,一样的商品,一样的数量。那么最终商品P的库存数量应该为 S - N - N。而执行上面的SQL,因为并发,导致两次查询到历史库存均是S(应该至少有一次qty为S - N),则更新完毕后,商品数量最终是 S - N。这种致命性的Bug,也属于超卖(虽然不会扣为负数),如果放在线上,简直是一个定时炸弹。

围绕解决这样的问题,考虑到并发安全以及并发性能,产生了各种解决方案。大体基于两种机制:悲观锁和乐观锁。在诸多场景里,基于每种锁,都有配套的辅助手段,以及各自不同的侧重取舍和相关实现。

考虑到本篇更主要的是做一些基础铺垫,也可为对于电商系统不太了解的朋友做一些相关引导,第一篇 ,暂告一段落。第二篇 —— 商城系统下单库存管控系列杂记(二) ,本人将找个专门的时间写,可能会篇幅上长很多,内容上紧接第四点,将会谈及较多的重要细节,以及相关应用实现,到时再进行具体延伸,以及其他扩展讨论。

End.

时间: 2024-09-30 06:45:17

[原创]商城系统下单库存管控系列杂记(一)(并发安全和性能基础认识)的相关文章

微信小程序购物商城系统开发系列-目录结构

上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的小demo. 这一篇文章我们主要的是介绍一下小程序的一些目录结构,以及一些语法,为我们后面的微信小程序商城系统做铺垫. 首先我们来了解下小程序的目录结构 Pages 我们新建的一些页面将保存在这个文件夹下面,每一个小程序页面是由同路径下同名的四个不同后缀文件的组成,如:index.js.index.

微信小程序购物商城系统开发系列-工具篇

微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统.新的生态,未来大部分应用场景都将给予微信小程序进行研发.基于对它的敬畏以及便于大家快速上手,特整理微信小程序商城开发系列,未来将持续增加微信小程序技术文章,让大家可全面了解如何快速开发微信小程序商城. 本篇文章主要介绍微信小程序官方提供的开发工具,俗话说:欲工善其身,必先利其器. 小程序开发文档地址https://mp.weixi

微信小程序购物商城系统开发系列

微信小程序购物商城系统开发系列 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统.新的生态,未来大部分应用场景都将给予微信小程序进行研发.基于对它的敬畏以及便于大家快速上手,特整理微信小程序商城开发系列,未来将持续增加微信小程序技术文章,让大家可全面了解如何快速开发微信小程序商城. 本篇文章主要介绍微信小程序官方提供的开发工具,俗话说:欲工善其身,必先利其器. 小程序开发文档地址

【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人品牌. 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在.经典”的写ORACLE PL/SQL编程的文章-! 觉得对你有帮助,请留言与猛点推荐,谢谢. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) 本篇主要内容如下:第一章 PL/S

yershop商城系统开发一——thinkphp和onethink简析

yershop商城系统是基于thinkphp和onethink开发而来,此系列将详细分析我在二次开发中所面临的种种问题. 本篇简要分析日常在二次开发中涉及到的thinkphp和onethink知识. yershop目录结构了解 此为我的项目中在zendstudio中截图 Addons:扩展插件目录,里面包含了第三方登陆插件.编辑器插件等: Application:项目目录,之后详细介绍 Data:数据库备份目录 Public:js.css.image网站图片资源保存 Uploads:上传图片.文

多用户商城系统 KgMall2.1发布

2014-5-28日,广州JUULUU发布多用户商城系统 KgMall2.1,kgMall是国内一款JAVA开源多用户版商城系统,新版KgMall更加模块化,juuluu团队重构了Kgcms的多个模块,使之更易于开发. KgMall2.1更新 1)改进默认模板 2)清除冗多模块,app包更小,下载更快. 3)app模块化,分离安全,orm,session管理等模块,app结构更严谨. 4)改进shop 标签库,商城模板易于进行二次开发. 5)对重点代码进行重构,对netbeans,eclipse

多用户商城系统 KgMall2.1公布

2014-5-28日,广州JUULUU公布多用户商城系统 KgMall2.1,kgMall是国内一款JAVA开源多用户版商城系统,新版KgMall更加模块化,juuluu团队重构了Kgcms的多个模块,使之更易于开发. KgMall2.1更新 1)改进默认模板 2)清除冗多模块,app包更小,下载更快. 3)app模块化,分离安全,orm,session管理等模块,app结构更严谨. 4)改进shop 标签库,商城模板易于进行二次开发. 5)对重点代码进行重构.对netbeans,eclipse

PHPSHE B2C 商城系统 v1.5版发布

[PHPSHE基本资料]:当前版本:PHPSHE B2C商城系统v1.5 (build 20170515 UTF8)官方网站:http://www.phpshe.com/phpshe 演示网站:http://www.phpshe.com/demo/phpshe 下载地址:http://www.phpshe.com/down/phpshe1.5.rar [PHPSHE系统简介]:PHPSHE商城系统是将商品管理.品牌管理.规格管理.促销管理.优惠券管理.在线购物.订单管理.资金管理.提现管理.支付

乐返app模式开发乐返商城系统

乐返app模式开发乐返商城系统(微or电 158.1500.1390 杨)乐返系统开发,乐返模式开发系统,乐返商城系统开发,乐返返利模式定制开发,乐返app开发,乐返app模式软件开发. 乐返系在经济大环境下,生意越来越难做,销量很难提升,口碑传播靠内容生产,成本太高,见效太慢.消费全返系统开发已经成为广大商家们最爱模式之一,更是以迅雷不及掩耳之势占领微信商城一席之地. 一.消费全返系统实现三者共赢模式消费全返,一个同时利于平台.商户.消费者的商业模式,尤其是利于消费者的商业模式,比如你购物不用