系统设计,如何设计一个秒杀功能

news/2024/10/7 15:07:23/

需要解决的问题

  1. 瞬时流量的承接
  2. 防止超卖
  3. 预防黑产
  4. 避免对正常服务的影响
  5. 兜底方法

前端设计

  • 利用 CDN 缓存静态资源,减轻服务器的压力
  • 在前端随机限流
  • 按钮防抖,防止用户重复点击

后端设计

  • Nginx 做统一接入,进行负载均衡与限流
  • 用 sentinel 等进行业务端限流
  • 服务拆分,将秒杀功能拆分为独立的服务,避免对现有服务产生影响
  • 秒杀数据的缓存,使用分布式缓存或本地缓存方案,需要缓存预热
  • 精准地库存扣减,防止超卖
  • 风控识别黑产,需要动态黑名单
  • 设置验证码防止脚本秒杀
  • 幂等设计,防止重复下单
  • 兜底方案,如果服务压力过大或者代码有漏洞,直接关闭秒杀及时止损

业务手段

通过预约、预售等方式避免秒杀的高并发流量。

详细分析

一、瞬时流量的承接

1、 秒杀活动即将开始时,用户会不断刷新页面,前端资源的访问也会消耗大量的资源。可以把这部分压力给到 CDN 厂商。
2、 秒杀的大部分请求都是无效的,可以在前端设置随机限流,使部分请求直接返回失败。
3、 对于发出的请求再次通过 lvs、nginx、sentinel 层层限流。
4、 打到后端服务后可以利用分布式缓存(Redis)或本地缓存(Caffeine)承接读写。
请添加图片描述

二、库存扣减

库存扣减需要防止并发导致的超卖。常用的是通过乐观锁解决问题:

update items set num = num - 1 where id = 1 and num > 0;

使用这个语句会产生热点行问题,压测下性能不高。优化方式如下:

  1. 数据库补丁优化。可以使用阿里云的 RDS,结合 Inventory Hint 单行热点更新性能可达 3.1 万 TPS。原理简单来说就是会把相同行的修改请求分为一组,仅组内第一条语句需要抢锁,后续语句直接修改即可,不需要再次查询,仅需一次分组提交事务即可。
  2. 库存拆分。将 1000 个库存拆分成 100 个小库存,每个小库存内有 10 个库存。
  3. 使用 redis + lua 脚本控制库存的扣减。redis 扣减完毕后可以通过 MQ 发送一个异步消息把数据库中的库存扣掉,实现最终一致性。如果 redis 操作成功, MQ 发送失败怎么办? 为 MQ 设置死信队列、重试等机制; redis 扣减库存时记录日志,如果 MQ 故障则检查日志进行补偿。

http://www.ppmy.cn/news/1535745.html

相关文章

Android15车载音频之Virtualbox中QACT实时调试(八十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

设计模式之装饰器模式(Decorator)

一、装饰器模式介绍 装饰模式(decorator pattern) 的原始定义是:动态的给一个对象添加一些额外的职责。 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。 在软件设计中,装饰器模式是一种用于替代继承的技术,它…

【信息系统项目管理师考题预测】合同管理

信息系统项目合同管理是项目管理中的重要环节,其常考题目通常涉及合同管理的各个方面,包括合同的订立、履行、变更、终止以及违约索赔管理等。 一、选择题 以下哪项不属于合同管理的范畴? A. 合同的订立 B. 回答潜在卖方的问题 C. 合同的履行 D. 合同的变更 解析:B。回答潜…

C++ list 容器类的模拟实现

前言: 我们不仅仅要熟悉使用c标准库中的 list 容器,我们更要学习了解标准库是如何将 list 容器实现出来的,这就是我们常说的知其然也要知其所以然,学习源码中优秀的部分,将 list 容器进行模拟实现出来,使得…

C++ 泛型编程指南 类模板,类型推断,特化,别名模板

文章目录 [TOC]1.声明一个类模板2.模板类成员函数实现3. 使用 Stack 类模板 4.部分使用类模板5.模板类的特例化6. 模板类的偏特化6.1 区分偏特化和全特化6.1.1 偏特化6.1.2 全特化 6.2 偏特化 例子6.2.1 指针类型偏特化6.2.2 多个参数的偏特化 解释:6.3 偏特化匹配歧…

解决CentOS 7 yum install 出现 No such file or directory 错误的方案

CentOS 7 yum install之后 出现No such file or directory错误的解决方案: [rootcentos7 ~]# yum install -y git File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxError: invalid syntax [rootcentos7 ~]# yum -bash: /usr/bin/yum:…

Atcoder Beginner Contest 374 D题题解

一. 题目描述 题目传送门 - Atcoder Beginner Contest 374 D - Laser Marking 二. 思路分析 1.题目大意 在平面上给你一个激光(可看作一个点)和若干条线段(左右端点分别为 ( a i , b i ) (a_i,b_i) (ai​,bi​) , ( c i , d…

怎么不改变视频大小的情况下,修改视频的时长

视频文件太大怎么变小?不影响画质的四种方法 怎么不改变视频大小的情况下,修改视频的时长 截取结尾的时间你可以使用 ffmpeg 来裁剪视频的结尾部分。假设你想去掉视频最后的3秒钟,可以先使用 ffmpeg 获取视频的总时长,然后通过指定一个新的…