跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 如何设计一套完整的订单系统,或者完整的业务流程?
未分類
9 1 月 2021

如何设计一套完整的订单系统,或者完整的业务流程?

如何设计一套完整的订单系统,或者完整的业务流程?

資深大佬 : hakunamatata11 5

我之前在阿里巴巴技术部门担任团队面试官,多次负责淘宝双十一的订单系统维护,工作 2 年多从未出过 bug,对于这个问题我还是比较有发言权的。

利益相关,拿几个订单系统的设计要点跟大家聊一聊。

防超卖问题

当商家将产品库存设置为有限数量时,买家下单产品就会减少相应的库存,其实现机制是:

读取库存表,判断库存,然后扣减库存

1.查询库存余量

SELECT available_stock FROM `seckill_activity`  WHERE commodity_id = 189 AND id = 28; 

2.扣减库存

UPDATE `seckill_activity` SET available_stock = available_stock- 1  WHERE commodity_id = 189 AND id = 28 AND available_stock > 0; 

然而当大流量并发请求数据库时,就有可能导致系统崩溃,导致超卖。超卖即“超卖缺货”,当宝贝库存接近 0 时,如果多个买家同时付款购买此宝贝,就会出现“超卖缺货”现象。

这种情况一般会出现在大型秒杀活动上,每个秒杀的用户都去数据库查询库存校验库存,然后扣减库存,导致数据库崩溃。

应对措施是将库存信息加载到 Redis 中,将 MySQL 的访问压力转移到 Redis 上,直接通过 Redis 来判断并扣减库存。订单系统常用的数据库是 MySQL,但在秒杀环境下会将库存信息加载到 Redis 中,将 MySQL 的访问压力转移到 Redis 上,直接通过 Redis 来判断并扣减库存。

这是因为两者的性能不同:MySQL 数据库单点能支撑** 1000 QPS,但是 Redis 单点能支撑 10 万 QPS**,更适合秒杀环境。

重点来了,订单系统设计中最常考的一个知识点就是 Redis 的特点。

  • 性能极高,基于内存运行–Redis 单服务器 能读的速度是 110000 次 /s,写的速度是 81000 次 /s
  • Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • 单线程运行,通过 IO 多路复用实现并发。
  • 支持多种数据非关系型的数据结构: 字符串 /数字 (STRING) 哈希表 (HASH) 链表 (LIST) 集合 (SET) 有序集合 (ZSET)
  • 所有单个指令操作都是原子的,即要么完全执行成功,要么完全执行失败。同时还支持多个指令也可以通过 Lua 脚本事务操作实现原子性。
  • 支持分布式,集群部署

想了解关于Redis 的更多应用场景,可以移步我主讲的免费讲座《电商秒杀项目实战》,系统介绍了订单系统中用到的各种技术栈和知识点,提供项目源代码,带你用 2 周时间完成一个完整的秒杀系统项目。

戳我即可免费试听

库存超卖的解决方案

1.缓存库存信息

由于大部分数据读取请求都被 Redis 挡住了,保护了 MySQL

2.检查 Redis 库存和扣减

Redis 库存是两步操作,通过 Lua 脚本将这两步操作,合并成一个整体,保证原子操作性

3.MySQL 复检

哪怕 Redis 侧方行,可以创建订单了,到 MySQL 的时候也需要再检查一次

如何设计一套完整的订单系统,或者完整的业务流程?

Redis 扩展:Lua 脚本

Redis 的扩展还有 Lua 脚本,Lua 脚本功能是 Reids 在 2.6 版本中推出, 通过内嵌对 Lua 环境的支持,Redis 解决了长久以来不能高效地处理 CAS ( Compare And Swap )命令的缺点并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。

Lua 脚本是类似 Redis 事务,有一定的原子性,不会被其他命令插队,可以完成一些 Redis 事务性的操作。

如何设计一套完整的订单系统,或者完整的业务流程?

此外,关于订单系统如何应对瞬时大流量高并发、如何保证系统稳定和高可用,我在《电商秒杀系统 – Spring 项目实战》里都有深度的分析,目前开放免费试听,对订单系统感兴趣的朋友戳我体验一下。

大佬有話說 (0)

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具