秒杀系统总结

欢迎大家到我的博客浏览。秒杀系统总结 | YinKai's Blog

秒杀:<!--more-->

做一个秒杀系统,我们需要与业务方进行沟通交流,了解清楚,才能设计出一个比较符合业务的系统,一般的流程会在后面进行一个阐述。

1、需求对齐
  • 做什么:了解什么时间,秒杀什么,数量是多少,有没有限制

    • 比如 2023年10月18日,在淘宝秒杀100台华为手机,原价15000,现价13000,一人限购一台

  • 业务流程

    • 进入商品详情页

    • 还在倒计时

    • 倒计时结束,检查是否秒杀结束。秒杀都付完款结束,就没必要继续进行

    • 检查是否名额还有剩余,没有的话, 就不能再点购买;这时候可能还会有机会,可能有人没付款或者系统原因有少卖的 名额退还,关于少卖,我们后面说原因。

    • 点购买

    • 库存抢夺,这里有许多细节,后面讨论

    • 抢到了,就创建订单

    • 在时间内支付,过时失效

    • 购买成功。

2、请求量对齐

不同的请求量的方案是完全不一样的,需要确定两个地方:

  1. 整体的流量有多大:预估业务到达时的压力

  2. 后端服务要支持多大的请求量:后端正常服务多少请求量,超过的就限流掉。

    下面是对不同请求量的分析与方案:

  • 5k:直接使用 MySQL 抗,上线前需要实际测试。

  • 1w:可以考虑使用两台 MySQL。

  • 10w:不能采用 20 台 MySQL,需要考虑成本。可以用一台 Reids 来搞库存,顶 10 台 MySQL,加上本身 Redis 只吃内存,不吃 CPU。

  • > 10w:Redis 集群,把库存分散到 Redis 不同分片,不同的用户走不同的分片,流量分散,分开抢名额。

3、精准度对齐
  • 能否多卖:

    • 什么时候会发生:在高并发下用 Redis 管理库存时,如果 Redis 重启则可能丢失已经执行的命令,库存变多;如果 Redis 是主从模式,假设发生切换,也可能丢失一部分命令,库存变多;如果查询库存和扣减库存不是原子性,在高并发下可能超卖

    • 如何解决:

      • 不允许发生:使用一致性更强的 MySQL 来保护,Redis 挂了再恢复可能丢失的数据,主从切换也可能会丢数据。

      • 允许小概率超卖:库存走 Redis 即可,毕竟发生崩溃刚好丢数据也是小概率事件,Redis 抢到就是成功,根据抢到的结果,创建支付单即可,业务也会变得简单,Redis 名额 和 MySQL 库存的一致性就不存在了。

  • 能否少卖:

    • 什么时候会发生:库存扣减了,但订单没生成;订单生成了,用户没付款,回退可能失败。

    • 如何解决:

      • 不允许:需要一个补偿机制

      • 允许发生:那就不需要补偿机制

4、难点分析
  • 高并发:海量请求砸下来,可能导致服务直接挂掉,活动 G 了

    • 流量削减

      • 预约:预知大概的流量,与实际流量相差大概一个量级

      • 验证码:拉平请求,通过验证码,将大家操作的时间由原本的一秒,拉到 1~10s 之间,相当于将请求平摊了。

      • 限流:超过的流量就拒绝掉,这个是必须做的,因为不知道会由多大的流量到来,通过限流来兜底。

      • 削峰:异步化削峰。

        • 就是在对请求做完参数检查、频率限制之后,把后续的一整个流程进行异步化处理。可能会导致用户体验差:圈圈转很久,最后提示:商品已抢完。

        • 其他方案:通常就是通过 Redia 来预扣库存,为了避免混淆,我们把 Redis 中的:成为名额、抢到名额,在绝对部分情况下都能发券成功时,再让用户等待一会是可以接收的。

        • 业务逻辑:

          • 校验请求

          • 确认并扣减名额

          • 记录扣减名额信息

          • 将扣减名额成功的信息直接发给库存服务或者先丢入异步队列。

      • 风控:购买资格,是否达到购买的条件;风控系统,防止恶意刷单、脚本抢购、多个账户同时抢等。

        • 打击黄牛:针对某个用户接口次数过于频繁,可以只针对该用户做限制

        • 针对 IP 做限制:但容易误杀,因为可能有同一个网络的用户,都是一个出口 IP。所以针对 IP 限流的阈值页不能太低,更多的还是兜底。

        • 验证码:将 90% 的时间都用在验证码输入上,降低使用脚本点击的影响

      • 限购

  • 高精准

    • 库存减扣

      • 预扣库存:MySQL 扛不住,Redis 不够可靠,按 10w 以上流量来考虑,通过的方案就是 Redis 预扣库存操作,也就是 Redis 中存放的,可以看作名额,真正的库存不在这里。

      • MySQL 扣减:MySQL 中存放真正的库存,这里需要通过 MySQL 保证库存可靠的

      • 减扣记录:MySQL 扣减成功后,就会创建订单,前端会跳到支付页,支付之后,等待支付成功。

    • 库存补偿

      • 定时任务:订单超时未支付,额度加载回 MySQL,直接加载 Redis,失败了还有名额加载逻辑兜底。

更新中。。。

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

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

相关文章

bootstrapTable 显示内容过长,鼠标悬停展示全部

{ field :logisticsreturnapplymassage, valign : middle, title : 物流返回消息&#xff08;申请&#xff09;, align: center, …

在Windows WSL (Linux的Windows子系统)上运行的Ubuntu如何更改主机名

在Windows 安装的Ubuntu&#xff0c;如何修改主机名。有列了两种方法&#xff0c;提供给大家参照。 文章目录 方法一&#xff1a;hostname指令修改方法二&#xff1a;修改配置文件修改hostnanmewsl.conf 文件配置选项推荐阅读 方法一&#xff1a;hostname指令修改 hostname指…

logstash 配置文件语法介绍

大家好&#xff0c;我是蓝胖子&#xff0c;之前在构建服务监控实践那个系列里&#xff0c;有提到用logstash来做日志的收集&#xff0c;但是对于logstash的配置文件语法没有做很详细的介绍&#xff0c;今天就来详细聊聊logstash配置文件的语法。 很多时候一门新框架的配置都会有…

【虹科干货】ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性

ntopng为人所知的“身份”是被动流量监控。然而&#xff0c;如今的ntopng6.0也进化出主动监控功能来&#xff0c;漏洞扫描功能便是其中一个。那么漏洞扫描功能是什么&#xff1f;其独特之处是什么&#xff1f;用户该如何使用&#xff1f; 新的漏洞扫描和CVE支持&#xff0c;可…

使用脚手架创建Vue3项目

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Vue ✨特色专栏&#xff1a; MySQL学习…

Redis 两种持久化方式 AOF 和 RDB

目录 一、Redis 的持久化 二、Redis 的持久化方式 RDB RDB 介绍 RDB 的触发方式&#xff1a;. 三、RDB的文件生成策略 四、Save 和 Bgsave 命令的区别 六、RDB 最佳配置 七、触发机制-不容忽略方式 AOF 一、AOF介绍 二、RDB所存在的问题 三、AOF 三种策略 四、AOF…

谭巍主任贴心分享:想要HPV尽快转阴必吃的五种水果

HPV感染是常见的生殖道病毒感染&#xff0c;它可能导致宫颈癌等严重疾病。对于HPV感染者来说&#xff0c;转阴是预防和治疗的关键。北京劲松HPV诊疗中心主任谭巍认为除了接受正规的治疗和注意生活方式的调整外&#xff0c;饮食也是促进HPV快速转阴的重要方面。 一、苹果 苹果…

2.5 - 网络协议 - HTTP协议工作原理,报文格式,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 HTTP协议 1、HTTP协议工作原理2、HTTP协议报文3、H…

软件建模与文档:架构师怎样绘制系统架构蓝图?

Java全能学习面试指南&#xff1a;https://javaxiaobear 首先&#xff0c;请你设想这样一个场景&#xff1a;如果公司安排你做架构师&#xff0c;要你在项目开发前期进行软件架构设计&#xff0c;你该如何开展你的工作&#xff1f;如何输出你的工作成果&#xff1f;如何确定你的…

mysql文本类型的最大长度限制

mysql支持很多类型&#xff0c;不同的文本有不同的长度限制。可以根据实际需要进行选择。 TINYBLOB, TINYTEXT L 1 bytes, where L < 2^8 (255 Bytes) BLOB, TEXT L 2 bytes, where L < 2^16 (64 Kilobytes) MEDIUMBLOB, MEDIUMTEXT L 3 b…

Jupyter Notebook本地部署并实现公网远程访问内网Jupyter服务器【内网穿透】

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配…

Vue3中调用外部iframe链接方法

业务场景&#xff0c;点击某个按钮需要跳转到外部iframe的地址&#xff0c;但是需要在本项目内显示。以前项目中写过调用外部链接的功能&#xff0c;是有菜单的&#xff0c;但是这次是按钮&#xff0c;所以不能直接把地址配到菜单里。 实现方法&#xff1a;在本地路由文件里写个…

计算机组成原理-Cache写策略

文章目录 总览写命中写回法全写法 写不命中写分配法非写分配法 多级Cache总结 总览 写命中 写回法 数据不一致指的是Cache中的和主存中的数据不一致 全写法 写缓冲 利用写缓冲使得将写入Cache的数据在写入Cache的数据同时也会写入写缓冲。然后再在 CPU在干其他事时有控制电…

基于动量的梯度下降

丹尼尔林肯 (Daniel Lincoln)在Unsplash上拍摄的照片 一、说明 基于动量的梯度下降是一种梯度下降优化算法变体&#xff0c;它在更新规则中添加了动量项。动量项计算为过去梯度的移动平均值&#xff0c;过去梯度的权重由称为 Beta 的超参数控制。 这有助于解决与普通梯度下降相…

数据结构 / 顺序表 / 顺序表概述和结构体定义

1. 顺序表概述 顺序表&#xff1a;线性表的顺序存储称为顺序表逻辑结构&#xff1a;线性结构(一对一)存储结构&#xff1a;顺序存储(使用一段连续的存储空间存储类型相同的数据元素)顺序表&#xff1a;逻辑相邻&#xff0c;物理也相邻顺序表是借助于数组实现&#xff0c;但是不…

【Spring】Spring是什么?

文章目录 前言什么是Spring什么是容器什么是 IoC传统程序开发控制反转式程序开发理解Spring IoCDI Spring帮助网站 前言 前面我们学习了 servlet 的相关知识&#xff0c;但是呢&#xff1f;使用 servlet 进行网站的开发步骤还是比较麻烦的&#xff0c;而我们本身程序员就属于是…

算法leetcode|90. 子集 II(rust重拳出击)

文章目录 90. 子集 II&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 90. 子集 II&#xff1a; 给你一个整数数组 nums &#xff0c;其…

Android查看当前机器的ABI类型

文章目录 使用 adb 命令&#xff1a;使用设备设置&#xff1a; 在 Android 设备上&#xff0c;可以通过执行以下步骤来查看当前机器的 ABI&#xff08;Application Binary Interface&#xff09;类型&#xff1a; 使用 adb 命令&#xff1a; 连接 Android 设备&#xff1a; 确保…

嵌入式基础知识学习:I2C通信协议

https://zhuanlan.zhihu.com/p/647656964 https://blog.csdn.net/FYBZ2020/article/details/128486981 I2C总线概述 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线是两线式串行通信总线&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。 在介绍I2C总线…

【转】ORB-SLAM2调用OAK-D双目摄像头进行点云建图

编辑&#xff1a;OAK中国 首发&#xff1a;A. hyhCSDN 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容来自用户的分享&#xff0c;如有疑问请与原作者交流&#xff01; ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 近期在CSDN刷…