V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hakunamatata11
V2EX  ›  推广

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

  •  
  •   hakunamatata11 · 2021-01-12 16:14:23 +08:00 · 778 次点击
    这是一个创建于 1254 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我之前在阿里巴巴技术部门担任团队面试官,多次负责淘宝双十一的订单系统维护,工作 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 项目实战》里都有深度的分析,目前开放免费试听,对订单系统感兴趣的朋友戳我体验一下。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5368 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 06:31 · PVG 14:31 · LAX 23:31 · JFK 02:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.