大型电商系统的订单设计

news2025/1/12 3:47:21

前言:电商系统需要满足商品、订单、支付、会员、优惠券、秒杀、拼团、砍价、分销、积分等多种经营需求。其中订单模块是比较核心复杂的,需要架构师在上面下不少功夫。


0、电商系统业务架构图

 电商系统,一般包括前台商城系统及后台管理系统,前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。


1、避免重复下单支付

解决方案:

(1)通过订单id来校验其幂等性

(2)支付接口在Nginx层面不要设置失败或超时重试


2、商品快照

商品快照:当消费者下单时,会产生商品状态、详情、参数的截图,称为商品快照。商品快照不会根据商家后续编辑、修改进行调整。商品快照的作用就是后续订单若发生交易纠纷,电商平台将以商品快照的信息作为重要参考凭证。

商品信息是可以修改的,当用户下单后,为了更好解决后面可能存在的买卖纠纷,创建订单时会同步保存一份商品详情信息,称之为订单产品快照。

同一件商品,会有很多用户会购买,如果热销商品,短时间就会有上万的订单。如果每个订单都创建一份快照,存储成本太高。另外商品信息虽然支持修改,但毕竟是一个低频动作。我们可以理解成,大部分订单的产品快照信息都是一样的,除非下单时商户修改过。

我们的解决方案是,用新下单的订单id直接关联最新一份的产品快照id即可。由于订单产品快照属于非核心操作,即使失败也不应该影响用户正常购买流程,所以通常采用异步流程执行。


3、购物车混合存储

购物车是电商系统的标配功能,暂存用户想要购买的商品。分为添加商品、列表查看、结算下单三个动作。

技术设计并不是特别复杂,存储的信息也相对有限(用户id、商品id、sku_id(库存量)、数量、添加时间)。这里特别拿出来单讲主要是用户体验层面要注意几个问题:

添加购物车时,后端校验用户未登录,常规思路,引导用户跳转登录页,待登录成功后,再添加购物车。多了一步操作,给用户一种强迫的感觉,体验会比较差。

如果细心体验京东、淘宝等大平台,你会发现即使未登录态也可以添加购物车,这到底是怎么实现的?

细细琢磨其实原理并不复杂,服务端这边在用户登录态校验时,做了分支路由,当用户未登录时,会创建一个临时Token,作为用户的唯一标识,购物车数据挂载在该Token下,为了避免购物车数据相互影响以及设计的复杂度,这里会有一个临时购物车表。


4、库存超卖

常见的库存扣减方式有:

  • 下单减库存:即当买家下单后,在商品的总库存中减去买家购买数量。下单减库存是最简单的减库存方式,也是控制最精确的一种,下单时直接通过数据库的事务机制控制商品库存,这样一定不会出现超卖的情况。但是你要知道,有些人下完单可能并不会付款。

  • 付款减库存:即买家下单后,并不立即减库存,而是等到有用户付款后才真正减库存,否则库存一直保留给其他买家。但因为付款时才减库存,如果并发比较高,有可能出现买家下单后付不了款的情况,因为可能商品已经被其他人买走了。

  • 预扣库存:这种方式相对复杂一些,买家下单后,库存为其保留一定的时间(如 30 分钟),超过这个时间,库存将会自动释放,释放后其他买家就可以继续购买。在买家付款前,系统会校验该订单的库存是否还有保留:如果没有保留,则再次尝试预扣;如果库存不足(也就是预扣失败)则不允许继续付款;如果预扣成功,则完成付款并实际地减去库存。

至于采用哪一种减库存方式更多是业务层面的考虑,减库存最核心的是大并发请求时保证数据库中的库存字段值不能为负数。

方案一:

通常在扣减库存的场景下使用行级锁,通过数据库引擎本身对记录加锁的控制,保证数据库的更新的安全性,并且通过where语句的条件,保证库存不会被减到 0 以下,也就是能够有效的控制超卖的场景。

方案二:

设置数据库的字段数据为无符号整数,这样减后库存字段值小于零时 SQL 语句会报错。


5、账户余额更新,保证事务

用户支付,我们要从买家账户减掉一定金额,再往卖家增加一定金额,为了保证数据的完整性、可追溯性,变更余额时,我们通常会同时插入一条记录流水。

  • 账户流水核心字段:流水ID、金额、交易双方账户、交易时间戳、订单号、

  • 注意:账户流水只能新增,不能修改和删除。流水号必须是自增的。

  • 后续,系统对账时,我们只需要对交易流水明细数据做累计即可,如果出现和余额不一致情况,一般以交易流水为准来修复余额数据。

  • 更新余额、记录流水虽属于两个操作,但是要保证要么都成功,要么都失败。要做到事务。

数据库的事务隔离级别有:读未提交(RU)、读已提交(RC)、可重复读(RR)、串行化(Serializable),常用的隔离级别是 RC 和 RR ,因为这两种隔离级别都可以避免脏读。

当然,如果涉及多个微服务调用,一般情况下,我们借助重试机制,保证最终一致是常用的方案。


6、读写分离导致数据不一致

互联网业务大部分都是读多写少,为了提升数据库集群的吞吐性能,我们通常会采用主从架构进行读写分离。

 部署一个主库实例,客户端请求所有写操作全部写到主库,然后借助 MySQL 自带的 主从同步 功能,做一些简单配置,可以近乎实时的将主库的数据同步给 多个从库实例,主从延迟非常小,一般不超过 1 毫秒。客户端请求的所有读操作全部打到 从库,借助多实例集群提升读请求的整体处理能力。

但是,主从同步虽然近乎实时,但还是有个时间差,主库数据刚更新完,但数据还没来得及同步到从库,后续读请求直接访问了从库,看到的还是旧数据,会造成一致性的问题。

因此,对实时性要求很高的by id查询,我们还是需要让它走主库,而不是一股脑地把所有读请求都往从库打。


7、历史订单归档

根据二八定律,系统绝大部分的性能开销花在20%的业务。数据也不例外,从数据的使用频率来看,经常被业务访问的数据称为热点数据;反之,称之为冷数据。

在了解的数据的冷、热特性后,便可以指导我们做一些有针对性的性能优化。这里面有业务层面的优化,也有技术层面的优化。比如:电商网站,一般只能查询3个月内的订单,如果你想看看3个月前的订单,需要访问历史订单页面。

实现思路:

1、冷热数据区分的标准是什么?要结合业务思考,可能要找产品同学一块讨论才能做决策,切记不要拍脑袋。以电商订单为例:

  • 方案一:以“下单时间”为标准,将3 个月前的订单数据当作冷数据,3 个月内的当作热数据。

  • 方案二:根据“订单状态”字段来区分,已完结的订单当作冷数据,未完结的订单当作热数据。

  • 方案三:组合方式,把下单时间 > 3 个月且状态为“已完结”的订单标识为冷数据,其他的当作热数据。

2、如何触发冷热数据的分离

  • 方案一:直接修改业务代码,每次业务请求触发冷热数据判断,根据结果路由到对应的冷数据表或热数据表。缺点:如果判断标准是时间维度,数据过期了无法主动感知。

  • 方案二:如果觉得修改业务代码,耦合性高,不易于后期维护。可以通过监听数据库变更日志 binlog 方式来触发

  • 方案三:常用的手段是跑定时任务,一般是选择凌晨系统压力小的时候,通过跑批任务,将满足条件的冷数据迁移到其他存储介质。在途业务表中只留下来少量的热点数据。

3、如何实现冷热数据分离,过程大概分为三步:

  • 判断数据是冷、还是热

  • 将冷数据插入冷数据表中

  • 然后,从原来的热库中删除迁移的数据

4、如何使用冷热数据

  • 方案一:界面设计时会有选项区分,如上面举例的电商订单

  • 方案二:直接在业务代码里区分。


8、订单分库分表,多维度查询

如果电商的订单数过多,我们一般会想到 分库分表 解决策略。没问题,这个方向是对的。

但是查询维度很多

1、买家,查询 我的订单 列表,需要根据 buyer_id 来查询

2、查看订单详情,需要根据 order_id 来查询

3、卖家,查询 我的销售 列表,需要根据 seller_id 来查询

4、最可怕的是管理系统,它会根据不同维度去查询订单

前三种场景通过买家库+卖家库的方案解决(买家库为“主”库),第四种则是通过DataBus将数据同步到ES搜索引擎来进行解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《动手学深度学习 Pytorch版》 10.2 注意力汇聚:Nadaraya-Watson 核回归

import torch from torch import nn from d2l import torch as d2l1964 年提出的 Nadaraya-Watson 核回归模型是一个简单但完整的例子,可以用于演示具有注意力机制的机器学习。 10.2.1 生成数据集 根据下面的非线性函数生成一个人工数据集,其中噪声项 …

GoLong的学习之路(七)语法之slice(切片)

书接上回,上回书中写道:指针,并说明了基本引用类型分配内存new和特定情况下slice(切片),map,channel等集合函数的内存分配make。这篇文章就开始说明,slice。 文章目录 slice&#xf…

人生道路选择,恳请前辈指点,半路出家学习java?

人生道路选择,恳请前辈指点,半路出家学习java? 首先答案肯定是可以的。Java作为一门高级语言,它很优秀地屏蔽了许多繁枝末节。很多科班出身的人上来可能会先学C、C,要学会怎么管理内存等很底层的事情,而在开…

联想拯救者Y7000笔记本WiFi频繁掉线的坑

2023年10月的某一天开始,跟了我近4年的联想拯救者Y7000本本,无线网总是频繁的掉线,连上没几分钟就断开了,同办公室的其他电脑没这种情况出现,一开始以为是运营商网络问题,或者路由器问题导致的,…

多通道图片的卷积过程

多通道(channels)图片的卷积 如果输入图片是三维的(三个channel),例如(8,8,3),那么每一个filter的维度就是(3,3,3&#x…

一文彻底理解C语言中的指针

假定给你一块非常小的内存,这块内存只有8字节,这里也没有高级语言,没有操作系统,你操作的数据单位是单个字节,你该怎样读写这块内存呢? 注意这里的限定,再读一遍,没有高级语言&#…

rabbitmq-3.8.15集群、集群镜像模式安装部署

目录 一、环境 1、映射、域名、三墙 2、Erlang和socat安装(三台服务器都实行) 二、部署三台rabbitmq-3.8.15实例 1、rabbitmq官网下载地址 : 2、解压rabbitmq 3、添加系统变量 4、启动web插件、启动rabbitmq 5、在rabbitmq1上添加用…

(PyTorch)PyTorch中的常见运算(*、@、Mul、Matmul)

1. 矩阵与标量 矩阵(张量)每一个元素与标量进行操作。 import torch a torch.tensor([1,2]) print(a1) >>> tensor([2, 3]) 2. 哈达玛积(Mul) 两个相同尺寸的张量相乘,然后对应元素的相乘就是这个哈达玛…

常见的芯片封装技术

两边出pin的封装 1、DIP封装 DIP封装(Dual In-line Package),也叫双列直插式封装技术,指采用双列直插形式封装的集成电路芯片,绝大多数中小规模集成电路均采用这种封装形式,其引脚数一般不超过100。DIP封装…

windows11录屏功能详解,记录你的精彩时刻

windows 11是微软最新推出的操作系统版本,拥有很多简单便捷的功能,包括内置的录屏工具,让用户可以轻松地录制屏幕内容。但是很多人不了解windows11录屏功能,本文将详细介绍windows 11录屏的三个方法,以及它们的优势和适…

HTTP图解基础知识

书:图解HTTP;分享书中学到的东西,内容很多,极具可玩性关键字:http,cookie,状态,头部字段,缓存,Etag 参考示例:https://zhuanlan.zhihu.com/p/…

ChatGPT在机器学习中的应用与实践

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 引言 随着人工智能技术…

【Gan教程 】 什么是变分自动编码器VAE?

名词解释:Variational Autoencoder(VAE) 一、说明 为什么深度学习研究人员和概率机器学习人员在讨论变分自动编码器时会感到困惑?什么是变分自动编码器?为什么围绕这个术语存在不合理的混淆?本文从两个角度…

docker搭建waline评论系统

我这里是给博客网站嵌入评论系统的 1.登录LeanCloud 国际版,没有账号可以注册个 链接:点击跳转 2.新建应用,选择开发版(免费),商用版每个月最低消费5美刀。 3.在设置-应用凭证里面将AppID、AppKey、Maste…

基于springboot+vue校园短期闲置资源置换平台051

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

YoloV8改进策略:独家原创,LSKA(大可分离核注意力)改进YoloV8,比Transformer更有效,包括论文翻译和实验结果

文章目录 摘要论文:《LSKA(大可分离核注意力):重新思考CNN大核注意力设计》1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论YoloV8官方结果改进一:测试结果摘要 本文给大家带来一种超大核注意力机制的改进方…

FFmpeg编译安装(windows环境)以及在vs2022中调用

文章目录 下载源码环境准备下载msys换源下载依赖源码位置 开始编译编译x264编译ffmpeg 在VS2022写cpp调用ffmpeg 下载源码 直接在官网下载压缩包 这个应该是目前(2023/10/24)最新的一个版本。下载之后是这个样子: 我打算添加外部依赖x264&a…

应用系统集成-概述

应用系统集成-概述 随着网络技术的发展和日益增长的软件复杂度,几乎已经不存在一个完全孤立的应用系统了,万物互联在应用层面就是系统互联,应用系统集成成为软件系统架构是需要考虑的核心问题之一。 基本介绍 应用系统集成面临的挑战 所有的…

【网络编程】一文带你搞懂HTTPS协议

文章目录 一、什么是HTTPS协议二、关于加密三、数据摘要 | 数据指纹 | 数字签名四、HTTPS的工作过程探究方案1:只使用对称加密方案2:只使用非对称加密方案3:双方都使用非对称加密方案4:非对称加密 对称加密中间人攻击 五、引入证…

重要功能更新:妙手正式接入SHEIN供货模式(OBM)店铺,赋能卖家把握出海新机遇!

继接入SHEIN平台模式店铺之后,妙手ERP积极响应卖家需求,正式接入SHEIN供货模式(OBM)店铺,并支持产品采集、批量刊登、产品管理等功能,帮助跨境卖家快速上品、高效运营,把握出海新机遇。 SHEIN供…