【系统设计】高性能秒杀系统如何设计?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

系统设计

在这里插入图片描述

首先说一下 案例背景 :设计一个秒杀系统,秒杀系统的特性就是一瞬间峰值流量很大,远远大于常规时期的流量

如果对于这种峰值流量不采取应对措施的话,那么突然增大的流量就会导致系统负载升高,甚至系统瘫痪,所有业务都崩溃无法使用

加机器可以应对吗?

那我们先来思考一下通过添加机器是否可以应对下秒杀流量

那么对于这种尖刺流量,我们要做的第一步就是在活动开始之前,对于请求量进行预估,来给对应的业务增加机器,但是增加机器的话存在两个问题:

image-20240229194805782

第一个问题:增加机器数量不确定

如果机器节点增加少了,仍然会导致系统资源不够用的情况;如果机器节点增加多了,比较浪费资源

并且秒杀活动一般就持续几分钟,为了这几分钟来增加大量节点,要做许多运维工作以及评估流量工作,相对来说效率比较低

第二个问题:个别业务性能与机器数量无关

比如说 扣减库存 的业务,需要加上分布式锁去扣减库存,那么无论是加多少个机器节点,并发度都不会有提升,那么我们只有去对业务进一步优化,以此来提升系统的性能

秒杀应对方案

那么上边说了,通过添加机器会带来许多运维上的复杂度,并且不好评估,那么有没有其他方案来应对秒杀中的尖刺流量呢?

在高并发系统中,应对高并发流量通用的有 3 种方式:分流缓存异步

这里就是通过 异步 这种方式来应对秒杀中的峰值流量

在秒杀中,用户一瞬间会发送大量下单请求,如果每一个请求都直接去进行对应的业务处理(扣减库存、生成订单),那么系统在短时间内肯定是处理不完这么多的下单请求的

如果对每一个请求都去进行对应的业务处理,系统处于高负载状态,有些请求就会失败,返回超时提示,于是用户就重新刷新界面,发送更多的请求,对后台系统造成更大的压力,导致系统瘫痪

因此考虑使用对下单请求处理 异步化 ,当收到下单请求后,不立即进行处理,而是先放入到队列中,下单系统 根据自己的处理能力 来队列中取出下单请求进行处理

这样就可以避免整个系统因为处理大量的请求而处于高负载的状态了,整个流程如下:

image-20240229202804169

  • 因此经过队列优化后,整个秒杀的下单流程为:

1、用户提交订单请求,请求进入到队列中,并返回用户一个排队编号

2、用户提交订单后,进入到等待界面中,显示用户前边还有多少请求等待处理,预计多长时间处理完毕

3、当用户的订单被下单系统成功处理之后,将用户界面跳转到支付页面,提示用户进行支付,之后就完成这笔订单

这就是使用了队列来进行削峰 ,将瞬时的峰值流量给分散铺平,避免系统的不稳定

技术选型

上边说到了使用队列对秒杀系统进行优化,那么队列该如何选型呢?

我们常用的消息队列有 RocketMQ、Kafka 等等,这里并没有选用这些消息队列,而是 使用了 Redis 来实现队列

相比于 RocketMQ 这些,Redis 更加轻量,并且基于内存操作,性能更好,使用 Redis 自带的队列数据结构,可以获取 队列长度 以及 请求在队列中的位置 ,可以及时反馈给用户排队进度

  • 接下来说一些技术细节

队列分配: 在 Redis 中给每一个秒杀商品都分配一个队列,这样将大量的请求再分散在多个队列中,队列的进入、退出操作不会成为秒杀的瓶颈,对该商品的下单请求就会进入到对应商品的队列中

队列调度: 下单系统根据下单时间和队列长度来 选择队列 进行处理,避免某些用户等待较长时间都得不到处理

队列长度: 队列长度设置为秒杀商品的 库存数量 ,当处理完一个请求后,就 将队列的长度 -1 ,当队列长度为 0 时,说明该商品就已经被抢完了,不要让后边的用户再进入到队列中进行等待了

秒杀数据库和其他库分离:

对于秒杀的商品来说,库存扣减的瞬时压力是比较高的,因此可以将秒杀的库单独抽取出来,和常规商品分离,这样也大幅度提升了库存数据库的读写能力

image-20240229211602014

秒杀系统的可用性:

在秒杀活动中,如果这个秒杀系统出现问题,我们要有 兜底方案

可以设计常规的商品处理流程为兜底方案,对于用户的请求,可以走 常规商品处理流程 ,也可以走 秒杀处理流程

这样在秒杀流程出现问题时,可以及时切换回常规商品的处理流程,一定程度上提升系统的可用性(主要是前期秒杀系统上线时,没有经过线上环境的历练,可能会存在一些问题)

image-20240229211424734

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github-actions

文章目录 workflow触发器action市场contextsecrets 默认环境变量 workflow name: {{workflow name}} run-name: {{workflow runs name}}on: {{触发器}} #[push]env:{{定义workflow变量}}: valuejobs:{{job name}}:runs-on: {{运行机器}} #ubuntu-latestenv:{{定义job变量}}: v…

01-Vue2 介绍与指令的使用

1. Vue核心 1.1. Vue简介 1.1.1. 官网 中文官网Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)https://cn.vuejs.org/ 英文官网Vue.js - The Progressive JavaScript Framework | Vue.js (vuejs.org)https://vuejs.org/ 1.1.2. 介绍与描述 VUE是构建于用户界面的渐进…

HTTPS的加密过程

文章目录 前言一、为什么需要加密?二、只用对称加密可以吗?三、只使用非对称加密四、双方都使用非对称加密五、使用非对称加密对称加密六、引入证书1.如何放防止数字证书被篡改?2.中间人有可能篡改该证书吗?3.中间人有可能掉包该证…

第六课:NIO简介

一、传统BIO的缺点 BIO属于同步阻塞行IO,在服务器的实现模型为,每一个连接都要对应一个线程。当客户端有连接请求的时候,服务器端需要启动一个新的线程与之对应处理,这个模型有很多缺陷。当客户端不做出进一步IO请求的时候,服务器…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-37-如何截图-上篇

1.简介 这个系列的文章也讲解和分享了差不多三分之一吧,突然有小伙伴或者童鞋们问道playwright有没有截图的方法。答案当然是:肯定有的。宏哥回过头来看看确实这个非常基础的知识点还没有讲解和分享。那么在这个契机下就把它插队分享和讲解一下。Playwr…

CCF-A类 IEEE VIS‘24 3月31日截稿!探索可视化技术的无限可能!

会议之眼 快讯 IEEE VIS (IEEE Visualization Conference )即可视化大会将于 2024 年 10月13日 -18日在美国佛罗里达州皮特海滩的信风岛大海滩度假举行!圣彼得海滩,以其迷人的日落和和煦的微风,作为激发创造力和促进可视化社区内合作的完美背…

图片卷子怎么转换成word文档?3种方法轻松转换

图片卷子怎么转换成word文档?在日常学习中,将图片卷子转换成Word文档可以极大地方便学生们的学习和复习。首先,转换成Word文档后,学生们可以轻松地编辑、复制和粘贴其中的内容,从而快速整理学习笔记或制作复习资料。其…

一键生成任意前端项目

开始 方式一:根据数据库结构一键生成 方式二:根据(.sql, .java, .txt)描述文件单页面生成 总结 话不多说,作为后端开发人员,不爱写前端代码,但又不得不需要一个系统的管理端来配置些数据等等…

Unity3d Mesh篇(三)— 创建立方体

文章目录 前言一、Mesh组成二、使用步骤GetVertices方法GetTriangles方法OnDrawGizmos方法 三、效果四、总结 前言 在 Unity 中,创建立方体是学习和理解网格(Mesh)基础知识的重要一步。本篇教程将介绍如何使用 C# 脚本在 Unity 中创建一个简…

PSO-CNN-LSTM多输入时序预测|粒子群算法优化的卷积-长短期神经网络时序预测(Matlab)——附代码+数据

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序数据分享下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台…

怎样消除视频上的字幕和文字?3个方法值得推荐

怎样消除视频上的字幕和文字?消除视频上的字幕和文字不仅是一个常见的需求,更是一个对视频内容质量提升的关键步骤。特别是在处理从网络下载的带有水印或标识的视频时,这些额外的文字和信息往往会干扰观众的观看体验,甚至可能影响…

Excel中使用ROW函数自动更新行号或编号

操作步骤: 1、在编号“1”的单元格输入公式“ROW()-1”; 2、在上一步填好公式的单元格基础上下拉填充,即可批量得到编号,如果删掉其中的一行或几行,编号会自动进行更新。

vscode更新至1.86版本后,ssh远程连接服务器出现异常

问题 you are connected to an OS version that is unsupported by Visual Studio Code 你已连接到不受Visual Studio Code支持的OS 版本 原因是vscode更新到1.86版本后要求远程连接服务器的内核版本和库版本需要符合下面条件。 解决方法 因此有两种方法解决 1.更新服务器…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方,试一下一句话木马 txt 不让传txt 另存为tlyjpg,木马文件上传成功 给出了存放目录: Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

Java-nio

一、NIO三大组件 NIO的三大组件分别是Channel,Buffer与Selector Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通…

ChatGPT 是什么?如何订阅ChatGPTPLUS?

ChatGPT 是什么? ChatGPT 是一种大型语言模型(LLM),由OpenAI开发。 它使用深度学习技术来模拟人类的语言生成和理解能力,可以用于自然语言处理、对话系统等多种应用。 ChatGPT基于自然语言处理技术和神经网络模型&a…

无字母数字rce总结(自增、取反、异或、或、临时文件上传)

目录 自增 取反 异或 或 临时文件上传 自增 自 PHP 8.3.0 起,此功能已软弃用 在 PHP 中,可以递增非数字字符串。该字符串必须是字母数字 ASCII 字符串。当到达字母 Z 且递增到下个字母时,将进位到左侧值。例如,$a Z; $a;将…

化肥工业5G智能制造工厂数字孪生可视化平台,推进化肥行业数字化转型

化肥工业5G智能制造工厂数字孪生可视化平台,推进化肥行业数字化转型。随着科技的不断发展,数字化转型已经成为各行各业发展的必然趋势。在化肥工业领域,5G智能制造工厂数字孪生可视化平台的应用正在逐渐普及,为行业数字化转型提供…

vue3 + vite 项目可以使用纯Js开发吗?

答案:可以 创建项目: 按照链接参考或者按官方: webstorm 创建vue3 vite 项目-CSDN博客 项目目录 tsconfig.json 配置允许js allowJs指定是否编译js文件,在任意文件当中,如果我们模块使用js写的,那么我们需要 将all…

Redis---持久化

Redis是内存数据库,是把数据存储在内存中的,但是内存中的数据不是持久的,如果想要做到持久,那么就需要让redis将数据存储到硬盘上。 Redis持久化有两种策略: RDB > Redis DataBase RDB机制采取的是定期备份AOF …