秒杀系统的原则和注意项

news2024/10/8 13:24:17

做任何技术方案都需要结合当时的业务场景、资金情况、用户体量等维度综合考虑,没有最好的技术方案,只有最合适的技术方案。

做秒杀方案亦是如此,秒杀活动经常会引发高并发、系统宕机和库存超卖的棘手问题,作为开发者,我们该如何在保证系统稳定性的同时,防止业务风险呢?

本篇聊聊秒杀方案的几个原则和注意点,脑图见文末。

1、原则

纵观多种秒杀方案,没有相同的,但是这些方案都遵守了相同的原则。具体原则如下:

1.1、保护数据库

秒杀场景下,一定要优先保护数据库,这是重中之重。一旦数据库宕机,那系统彻底瘫痪,会给业务和口碑造成损失。保护数据库要注意如下几点:

  • 在应用层需要将不合格的请求全部拦截,避免逻辑触达到数据库。
  • 评估并发数,QPS等,给应用设置合理的数据库连接池数量,避免将数据库的连接耗尽。
  • 监控数据库,观测数据库的CPU、内存等压力,观测慢SQL等,一旦出现问题,及时作出响应。

1.2、保护应用系统

应用系统也是要保护的对象,不管是单体还是微服务,系统尽量不宕机。保护系统要注意这几点:

  • 如果有条件的话,将秒杀系统的BFF层做成独立的服务,这样就算本服务挂了,也不影响别的服务。
  • 评估秒杀活动的访问量,适当扩大部分微服务的负载数量,从而提高系统的响应能力。

1.3、提前退出

秒杀系统一旦对外开放,肯定会招来不少羊毛党,甚至恶意攻击。所以,在处理逻辑时,一定要做前置校验,一旦发现非法请求,直接中断。

如果有条件的话,也要做一些攻击型测试和压力测试,看看能否拦住非法请求,看看系统能否承受住压力。

1.4、不超卖

秒杀场景下的商品,一般都是赔本赚吆喝,真的是卖一单亏一单。一般秒杀的商品、价格、库存,都是公司的运营和管理层沟通确认的结果。

为了将亏损控制在合理的范围,要严格按照既定的库存去售卖,一定不能出现超卖的情况。

2、前端主要注意点

秒杀场景下,前端有一些注意点,如下:

  • 页面静态化:不管是在PC、H5、小程序还是APP,页面尽量静态化,能走缓存的走缓存,尽量少的去请求接口。
  • CDN:将涉及到的js、图片、html等静态资源,提前刷到CDN中,加快访问速度。
  • 从缓存读取数据:秒杀场景下用到的接口要和常规接口区分开,秒杀场景下的接口尽量是从Redis缓存中读取数据,然后响应给前端。前端也需要判断哪些数据可以存入前端缓存中,避免下次重复调接口获取。
  • 前端做拦截:前端页面也要做一些拦截动作,过滤非法请求。虽然作用不大,只防君子不防小人,但是也要做。一切能提前拦截掉非法请求的动作,都要做。

3、后端主要注意点

后端的注意事项较多,大致如下:

  • 弹性增加服务器:根据自身的整体部署情况,适当扩大负载。比如混合云部署的方式,可以按需临时租用几台云厂商的云服务器,等活动结束立马释放云服务器,这样成本最小。
  • 限流和降级:不管是在秒杀场景,还是其余场景,保护系统的手段就是限流、降级、熔断。不管搁在什么时候,都是这三板斧。
  • 前置校验:前置校验可以最大程度的拦住非法请求。比如校验恶意的重复IP、校验用户的重复下单、校验库存等等。
  • 缓存预热:对于秒杀的商品信息和库存,需要提前做缓存预热,比如将数据提前刷到Redis缓存中。
  • 定时任务
    • 及时释放库存:一般场景下,可能半小时才会取消未支付的订单。但在秒杀场景下,由于库存有限,避免恶意占库存,所以允许订单未支付的时间就要减少,比如3分钟。这种场景下,可以用定时任务及时取消订单,或者,采用消息队列的定时消息方案(比如RocketMQ的延迟消息)。
    • 校准缓存的库存:下单会占用库存,取消订单会释放库存。如果库存预热到了Redis,则需要有个定时任务去校准Redis里的库存数量。
  • 下单和减库存
    • 乐观锁减库存:更新数据库里的库存数量时,一定要使用乐观锁方案去避免超卖,类似update ttt set stock = xxx where product_id = yyy and stock = zzz;
    • 同步或异步:在走完前置逻辑后,则会进入到下单和减库存逻辑,此时,可以用同步方式直接调用,也可以用异步丢入到MQ的方式。具体采用哪种方式,需要根据系统的吞吐量去做评估。

4、总结

本文主要聊了秒杀方案的几个原则和前后端注意事项。方案千千万,原则就这么几个。最后,贴上一张脑图方便记忆。

本篇完结!欢迎 关注、加V交流、全网可搜(程序员半支烟)

原文链接:秒杀系统的原则和注意项

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

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

相关文章

火情监测摄像机:守护生命与财产安全的“眼睛”

随着城市化进程的加快,火灾隐患日益增多。为了有效预防和及时应对火灾事故,火情监测摄像机应运而生,成为现代消防安全的重要组成部分。这种高科技设备不仅能够实时监控火灾发生,还能为救援提供宝贵的信息支持。火情监测摄像机主要…

vulnhub-THE PLANETS-EARTH靶机

下载并导入靶机至VMWare,设置网络模式为NAT,开机 开启攻击机(kali),也设置为Nat模式,与靶机处于同一网段 扫描靶机ip Nmap 192.168.114.0/24 扫描网段内活跃的主机 可以推断靶机ip为192.168.114.129 扫描…

什么是源代码加密?十种方法教你软件开发源代码加密

什么是源代码加密 源代码加密是一种安全措施,它通过加密技术对软件的源代码进行保护,以防止未授权的访问、泄露、篡改或逆向工程。源代码是软件程序的原始代码,通常由程序员编写,然后编译成可执行程序。由于源代码包含了软件的设…

攻防世界---->工业协议分析2

前言:做题笔记。 下载 PCAPNG 说明是一个网络数据包文件。 那么直接用Wireshark查看分析。 调整一下长度显示: 可以看到 ARP协议: UDP 进行通信。 长度都是58,我们去找变动点。 转: flag{7FoM2StkhePz} 题外话&…

画质修复哪个软件好?提升老旧照片画质的黑科技分享

朝霞好看?拍它!落日好看?拍它! 回头一翻相册才发现,只有那一小部分的光影好看,那就把它放大裁出来! 放大了画面,画质降低画面模糊了,反而没有肉眼看的画面好看了咋办&a…

COSPLAY大赛静态HTML网页模板源码

源码名称:COSPLAY大赛静态HTML网页模板 源码介绍:一款cosplay大赛HTML网页模板源码,过往参赛选手会自动从腾讯大赛获取,可用于cosplay大赛,漫展等。 需求环境:H5 下载地址: https://www.5188…

SpringBoot框架下旅游管理系统的创新设计与实现

第二章 相关技术简介 2.1 JAVA技术 本次系统开发采用的是面向对象的Java作为软件编程语言,Java表面上很像C,但是Java仅仅是继承了C的某些优点,程序员很少使用的C语言的特征在Java设计中去掉了。Java编程语言并没有什么结构,它把数…

Linux:进程调度算法和进程地址空间

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 进程调度算法 1.1 进程队列数据结构 1.2 优先级 ​编辑 1.3 活动队列 ​编辑 1.4 过期队列 1.5 active指针和expired指针 1.6 进程连接 二 进程地址空间 2.1 …

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏

0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…

AI赋能新质生产力医院管理项目成功举办

2024年9月27日,为进一步贯彻实施《2024年全国卫生健康工作会议》精神,提升医学诊断准确性,优化医院服务流程,并降低医疗成本,清华大学智慧医疗研究院联合北京整合医学学会,在郑州大学第一附属医院东院区成功…

Java实体对象转换利器MapStruct详解

概述 现在的JAVA项目多数采用分层结构,参考《阿里巴巴JAVA开发手册》。 分层之后,每一层都有自己的领域模型,即不同类型的 Bean:  DO ( Data Object ) :与数据库表结构一一对应,…

蓝牙资讯|AirPods Pro 2推送新固件,或新增听力健康相关功能

苹果公司面向 USB-C 和 Lightning 两种型号的 AirPods Pro 2 耳机,推送了新的固件版本7A305,高于 9 月早些时候发布的 7A302 固件。 相关更新包含默认启用的听力保护模式(在嘈杂环境下提供被动降噪),以及一种“临床级…

大模型面试八股+答案,LLM-offer手到擒来!

你是否也曾为面试大模型八股文而苦恼?别担心!今天我就来给你分享一些绝妙的面试技巧,让你轻松应对! 🔍 第一关:了解题目 首先,一定要仔细阅读题目,理解清楚每个要求。明确问题的关键…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络: 由于 run 方法是在一个单独的线程上调用的,因此在完全连接网络之前,其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象,用于缓冲…

git clone 私有仓库时出现错误 Authentication failed for :xxxxxx

错误信息 remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended…

【算法】博弈论(C/C++)

个人主页:摆烂小白敲代码 创作领域:算法、C/C 持续更新算法领域的文章,让博主在您的算法之路上祝您一臂之力 欢迎各位大佬莅临我的博客,您的关注、点赞、收藏、评论是我持续创作最大的动力 目录 博弈论: 1. Grundy数…

手机商城系统小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,订单管理,商品信息管理,基础数据管理,地址管理,轮播图管理 微信端账号功能包括:系统首页&#…

Java数据结构栈和队列(Stack和Queue详解)

前言: 栈和队列是数据结构中重要的存储方式,也是建立在Arrarylist和LinkedList之上的数据结构。 本猿在C语言阶段就已经详细剖析过栈和队列,不熟悉的小伙伴可以翻看之前的博客内容! Java阶段一方面剖析Java中自带的Stack和Queue中…

宠物咖啡馆平台开发:SpringBoot框架的高效应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

【Spring】“请求“ 之传递 JSON 数据

文章目录 JSON 概念JSON 语法JSON 的语法JSON 的两种结构 JSON 字符串和 Java 对象互转JSON 优点传递 JSON 对象 JSON 概念 JSON:JavaScript Object Notation【JavaScript 对象表示法】 JSON 就是一种数据格式,有自己的格式和语法,使用文本…