怎么设计秒杀系统?

news2025/1/21 0:53:54

秒杀系统需要考虑哪些要素?

  • 要能支持高并发
  • 用户体验要好,不要返回异常信息
  • 对系统要友好(针对秒杀可以做业务上的隔离,单独把秒杀系统部署到独立的集群服务器上;可动态配置业务参数,比如商品金额,库存数量)
  • 避免高并发请求第三方系统

流量倒三角

用户的请求量是非常大的,需层层过滤(过滤掉无用的或重复的行为),最终有限的流量到达核心业务层。

动静分离或预热

在APP真正秒杀前,将要请求访问的页面资源缓存到客户端或CDN中,这样的话,在未来并发请求的时候,用户请求的是动态数据,而不是请求的静态数据,就不会因为请求数据量大,IO瓶颈等问题导致出现用户连接不上的异常。

隔离恶意请求

比如使用一些小工具,挂起多个线程疯狂抢购的恶意行为,可以采用nginx结合lua脚本以及通过redis限流,判断用户的有效性来隔离恶意请求。

用户的抢购状态

根据不同的用户抢购状态,定义好不同的处理路径

接入层要根据redis中的用户标识来判断是新进来秒杀的请求还是恶意的还是等待付款的请求。

如果是新进的用户,对商品库存进行扣减,如果能成功扣减,就代表这个用户抢到了这个商品。

请求经过nginx负载均衡到service服务,然后进行数据库加锁(串行化)进行扣减操作。

如果将扣减的行为落库,在高并发下,很容易出现数据库连接超时。

将数据库替换成redis

并发调用redis的本地方法decr减1,redis内部依然是串行化,单线程,减少了内核间线程切换的损耗。

redis底层用到了epoll,不需要阻塞遍历网络IO(数据到达->产生事件->处理数据)。

扣减成功即秒杀成功,但这还不是最终结果,因为还没有扣款。

nginx调用redis判断该商品是否还有库存,如果没有,则过滤掉后续对该商品的秒杀请求。

为了降低对服务层的冲击,接入层nginx可以有多个,通过LBS负载。

接入层nginx访问redis查看商品是否还有库存,如果没有,则直接更新客户端页面的js,客户端就没有必要再发起请求到服务器了。

service扣减成功后,然后进入订单交易流程,下单成功返回给用户秒杀成功提示,然后页面跳转进入扣款流程。

性能瓶颈

  • 对数据库的操作是串行化的,串行化就会产生性能瓶颈,所以需要将串行化的过程异构化。
  • 调用第三方支付,依赖第三方的可靠性,为了降低对外部系统的依赖,使用自有资金,比如花呗、京东白条。

将同步修改成异步(通过消息队列)

service服务通过MQ异步调用订单服务,将超出订单服务处理能力的流量放到MQ中,再由订单服务异步消费处理,这也是削峰的过程。

订单系统生成订单,给用户返回请求成功。

订单服务下单成功之后,也会往MQ中发一条消息,购买付款服务消费这条消息。

订单系统下了单,发送订单MQ消息,付款服务消费该消息,用户在点击付款跳转的页面可以看到这个订单信息。

用户确认订单信息之后,页面跳转进行购买付款的操作,通过接入层分流进入付款购买服务,付款购买服务查看订单的状态是否可以进行购买。

用户付款的时候,调用付款服务,付款服务产生一个MQ消息,再通过第三方支付服务消费消息再进行扣款处理。

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

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

相关文章

电磁兼容(EMC)的标准与测试内容

在国际范围上,电磁兼容标准的制定已经有了70多年的发展历程,最早为了保护无线电通信和广播,国际无线电干扰特别委员会(CISPR)对各种用电设备和系统提出了相关的电磁干扰发射限值和测量方法。到了20世纪60~7…

机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

目录 一、简介和环境准备 简介: 环境: 二、实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入、分析 2.模型训练、预测 三、原…

TiDB进阶篇-TiDB Server架构

简介 较深入的介绍TiDB Server。 TiDB Server 架构 图解 1.下面是负责SQL语句的解析和优化。 2.下面试负责TiKV存储多版本,过期版本的清理作用。 3.复杂SQL的拆分(如果是点查那么就不需要经过DistSQL)。 4.事务相关。 5.负责PD和TiKV的通信…

js 事件流程

描述 JavaScript 的执行是单线程的,后面的任务需要等待前面的任务完全完成后,再去执行。DOM 事件(文件的加载等)、定时器、网络请求等事件,并不会消耗 CPU,这些事件无需等候,所以出现了异步。主…

Java后端新人入职第一天,环境搭建,全看这篇就行了

本文主要是记录一下一个新人java后端开发来到一个新公司,如何快速将自己的相关开发环境搭建好,包括Java、Maven、Tomcat、idea、Redis、Mysql等等,有的公司会有相关版本的要求,不过安装配置步骤基本一样的,我这里就以目前比较流行的版本进行详细说明。 一:基础环境搭建:…

Arduino开发之如何连接GPS模块?

文章目录0、引言1、GPS模块说明2、接调试助手测试GPS模块接收数据3、代码编写4、功能演示0、引言 NEO-6M/7M GPS模块,具有高灵敏度、低功耗、小型化、高追踪灵敏度,大大扩大了其定位的覆盖面,在普通GPS接收模块不能定位的地方,如狭…

编译原理考试大题分析【太原理工大学】

有些基本公式可以看这里,大题内容请以本篇为准!https://blog.csdn.net/m0_52861684/article/details/130071191?spm1001.2014.3001.5501 之前说错了,考试题型没有简答题和填空题,只有十个选择题是 20 分,其余全是大题…

ESP32设备驱动-VEML6075紫外线(UV)光传感器驱动

VEML6075紫外线(UV)光传感器驱动 文章目录 VEML6075紫外线(UV)光传感器驱动1、VEML6075介绍2、硬件准备3、软件准备4、驱动实现1、VEML6075介绍 VEML6075 可感应 UVA 和 UVB 光,并使用 CMOS 工艺将光电二极管、放大器和模拟/数字电路集成到单个芯片中。 应用 UV 传感器时,它…

ChatGPT和GPT-4带你选笔记本电脑

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

最近ChatGPT封号太严重了,这里是解封攻略步骤(建议收藏)

这个周末,先是意大利暂时封杀ChatGPT,限制OpenAI处理本国用户信息。 接着,据韩国媒体报道,三星导入ChatGPT不到20天,便曝出机密资料外泄。 还没结束,又有大量网友发现ChatGPT目前停止注册,开始…

【vue】vue中下载文件的方法

文章目录1. 下载后端返回文件1.1 后端为post请求返回二进制流文件URL.createObjectURLFileReader1.2 后端直接返回get请求文件2. 下载本地文件1. 下载后端返回文件 1.1 后端为post请求返回二进制流文件 Blob Blob对象标识一个不可变、原始数据的类文件对象。Blob表示的不一定…

RabbitMQ( 发布订阅模式 ==> FanoutExchange )

本章目录: 何为发布订阅模式FanoutExchange具体使用一、何为发布订阅模式 在上一篇文章中,我们创建了Work Queue并且发送任务,在Work Queue中,每个任务只会被一个消费者消费,任务消费后就被清除了。 而在本篇中&…

0202心跳和服务续约源码解析-nacos2.x-微服务架构

文章目录1 客户端心跳任务2 服务端处理2.1 服务注册时开启客户端心跳检查2.2 客户端发送心跳任务续约2.3 服务实例移除2.4 心跳任务闭环结语1 客户端心跳任务 在上一篇文章0201服务注册源码解析-nacos2.x-微服务架构分析客户端服务注册的时候,流程在NacosNamingSer…

重装系统下载网址

[置顶]无论会不会安装系统,都一定会需要,觉得内容不错欢迎一键三连哦 稳定 | 方便 | 好用 1、MSDN 用过最简单好用,下载不限速,支持迅雷、IDM多种下载方式 https://www.xitongku.com 2、Windows系统下载仓储站 为小白重装系统提供…

KIOPTRIX: LEVEL 4通关详解

环境配置 vulnhub上下载的文件没有vmx 去3的文件里偷一个 记事本打开把所有Kioptrix3_vmware改成Kioptrix4_vmware 然后网卡地址随便改一下 打开后会提示找不到虚拟机,手动选一下就行了 信息收集 漏洞发现 web一上去就是一个登录框 扫路径发现database.sql 但是密码是错的…

高通开发系列 - linux arm64 toolchain交叉编译器编译错误

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述下载aarch64交叉编译器编译使能编译环境使能defconfig编译问题1:address-of-packed-member问题2:attribute-alias=问题3:array…

Kubernetes 笔记(14)— 滚动更新、定义应用版本、实现应用更新、管理应用更新、添加更新描述

滚动更新,使用 kubectl rollout 实现用户无感知的应用升级和降级。 1. 定义应用版本 在 Kubernetes 里,版本更新使用的不是 API 对象,而是两个命令:kubectl apply 和 kubectl rollout,当然它们也要搭配部署应用所需要…

人工智能作业之遗传算法

遗传算法1.遗传算法定义2.相关术语3.遗传算法的主要步骤4.遗传算法的参数设计原则5.代码实现1.遗传算法定义 遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法&am…

java 婚恋交友网站Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 婚恋交友网站是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

IMX6ULL学习笔记(22)——eLCDIF接口使用(TFT-LCD屏显示)

一、TFT-LCD简介 TFT-LCD(Thin Film Transistor-Liquid Crystal Display) 即薄膜晶体管液晶显示器。TFT-LCD 与无源 TN-LCD、 STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT)&#…