电商--抢购架构总结

文章目录

  • 背景
  • 业务流程
  • 业务难点
  • 技术难点
  • 技术方案
    • 技术方向
    • 具体落地
      • 客户端流控
      • 网关流控
      • 容器流控
      • 后端接口流控
      • 数据库流控
    • 流控总结
    • 优化
      • 读取加速
      • 异步化流程处理
      • 系统扩容
    • 压测
    • 监控
  • 总结
  • 参考文献

背景

这是个在做NFT电商项目时遇到的场景,要求运营可以商家某个系列的NFT商品,可以设置该系列商品个数和开售时间,当未到达开售时间时显示未开售,一旦到达开售时间时显示售卖中,当抢购完显示售崩。只有售卖中才可以进行抢购。

业务流程

在这里插入图片描述

客户端抢购流程中会涉及到商品数据的读取用于商品展示,运营活动数据的读取用于显示价格变化、活动策略校验,以及库存数据的读取用于校验库存是否还有剩余。

业务难点

技术难点

  • 短时间区间内的突发大流量,但是实际需要处理的请求却是有限

  • 库存只有一份,所有人会在集中的时间读和写这些数据。

技术方案

技术方向

  • 尽量将请求拦截在系统上游

传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超时,最终导致服务体验差,甚至服务瘫痪无法使用。

  • 充分利用使用缓存

这是一个读多写少的场景,非常适合使用缓存来处理读请求。

具体落地

客户端流控

客户端(web、安卓、IOS)请求拦截,当服务端响应慢导致客户端一直处于请求中时,用户习惯性 重复点击按钮来获取请求,这样会平白无故的增加了后端系统负载,80%的请求是这么多出来的。

对于这种重复请求,在产品层面可以要求用户点击按钮后,按钮置灰,禁止用户重复提交请求;代码层面,限制用户在x秒之内只能提交一次请求。 如此限流,大部分真实用户流量已拦。

网关流控

由于客户端安装包一旦被破解或者被抓包,那么对于客户端与服务端的交互流程就被暴露了,那么此时就可以通过一些手段去对服务端发出大量的请求。所以在客户端之后的网关层做流控就必不可少。网关限流的配置方法有很多种,现在的主流网关一般都支持配置访问限制,可以通过配置实现简单的流控(如nginx的连接数限流和漏桶算法实现的限流)。

容器流控

上述的流控做法只能限制用户异常访问,如果正常访问的用户数量很多,就有后端系统压力过大甚至异常宕机的可能,因此需要后端系统进行流控。网关过后就来到了容器层(tomcat、jetty),每个实例所能承受的QPS只有容器自己经过压测才知道。常见的如tomcat可以通过配置参数来进行流控。


## tomcat参数
# 队列大小
server.tomcat.accept-count=100
# 最大连接数
server.tomcat.max-connections=1000
# 最大活跃线程数
server.tomcat.threads.max=10
# 最小活跃线程数
server.tomcat.threads.min-spare=10

后端接口流控

容器的限流都针对的是整个实例。如果要实现更为精细的访问限制(具体到某个接口),可以在后端服务器上对不同业务实现访问限制。常见做法是可以通过在内存(针对每个实例接口的QPS)或缓存服务中(针对的是实例集群总的QPS)加入请求访问信息,来实现访问量限制。

由于不同接口依赖的第三方服务数量、第三方服务响应情况、数据库等情况不同,所以不同接口的流控限制也不同。

数据库流控

进过上面几步的流控,到达数据库的请求基本都是有效的请求了,但是对于这种抢购来说可能由于营销得好,此时还是涌入了大量的真实流量,但是真正数据库需要接收的流量又是有限的。这时候可以把请求数据库的操作放入队列内,数据层去获取队列进行消费,这样就控制了数据库的访问QPS,当库存被抢购一空时就可以将剩余的流量直接打回不请求数据库。

流控总结

这样经过了层层流控,从上到下流量呈现一个漏斗形态,越往下的服务接收到的流量越少,而最下层的数据层又是最重要的服务在这里得到很好的保护。

优化

流控主要解决了突发流量的问题,但是针对读多写少的问题我们还可以进行优化,让服务响应更加快,提升用户体验。因为再好的营销手段都需要技术的支持才能发挥出有效的收益。

读取加速

在抢购活动中,数据的操作一般都是读多写少。几百万的人最终能获取到商品的也就是那么有限个人,最后提交的订单最多也就商品个数的数量,但是在抢购过程中,这几百万人会一直产生大量的读取请求,并且读取的还是一些基本不变的信息。因此可以使用缓存服务对用户请求进行缓存优化,把一些高频、几乎不变的内容放到缓存中去。对于更大规模的系统,可以通过静态文件分离、CDN服务等把用户请求分散到外围设施中去,以此来分担系统压力。

异步化流程处理

对于接口内部流程通过消息队列、异步调用、流程拆分的方式可以实现异步处理,快速响应用户请求,让后端有较为充足的时间来处理一些非接口马上需要处理的流程(如支付成功后的发货流程,下单成功后的支付流程),提高对用户请求的响应速度,从而提升用户体验。通过消息队列还可以隔离前端的压力,实现排队系统,在涌入大量压力的情况下保证系统可以按照正常速率来处理请求,不会被流量压垮。

系统扩容

对一次成功的抢购活动来说,无论如何限流,如何优化系统,最终产生的流量与正常流量对比都是超出N倍的。因此临时性的系统扩容必不可少,系统扩容包括以下3个方面。

  • 增加系统规格:可以预先增加系统容量,比如提高系统带宽、购买更多流量等。
  • 服务扩展:无状态服务+负载均衡可以直接进行水平扩展,有状态的服务则需要进行较为复杂的垂直扩展,增大实例规格。
  • 后端系统扩容:缓存服务和数据库服务都可以进行容量扩展。

压测

再好的理论都需要实践的认证,对于这种关注度特别该的需求,更需要做上线前的压测来验证整个架构是否能承受期望的流量。需要有详细的压测方案文档的输出来帮助压测人员了解压测的流程以及需要压测的接口、流程,通过哪些报表来验证压测的结果,一旦出现性能问题需要APM平台体能哪些能力来帮助定位出出现性能的点在哪。对于压测这里不详细展开介绍。

监控

没有人能保证线上系统业务、性能上是完美的,所以需要完善的监控体系来帮助维护人员在问题爆发前能提早预警,在问题爆发时能得到通知,在问题爆发后能有所定位。对于监控体系这里不详细介绍。

总结

对于抢购、秒杀这种业务要提炼出他的特点来进行针对性的处理。

最后对于这种抢购、秒杀的需求因为它们的特殊性可以拆分出单独的服务来进行处理,这样有利于维护、优化、成本控制。

参考文献

秒杀系统架构优化思路

如何设计秒杀系统?

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

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

相关文章

PHP 文心千帆API接口对接

一:API 调用流程简介 创建一个智能云应用。根据实际需求创建智能云应用。创建成功后,获取AppID、API Key、Secret Key 等信息。API 授权。对应用的 AppID 进行授权。获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key &#xff0c…

2023上半年软考系统分析师科目一整理-04

2023上半年软考系统分析师科目一整理-04 企业信息化 企业信息化 企业信息化工程是将( A )相结合,改善企业的经营、管理、产品开发和生产等各个环节,提高生产效率、产品质量和企业的创新能力,从而实现产品设计制造和企业管理的信息化、生产过…

RocketMQ --- 高级篇

一、高级功能 1.1、消息存储 分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。 消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回…

探索uniapp+vue3解析markdown语法|uniapp键盘撑起

最近正在尝试使用uniappvue3开发仿制chatgpt会话功能。 如上图:经过测试在h5/App端/小程序端 均支持markdown语法解析,键盘撑起后,整体页面和顶部自定义导航栏不会被顶起。 uniapp markdown解析及语法高亮 使用了markdown-it和highlight.js…

了解和使用 Docker 镜像仓库

前言 在上文 《了解和使用 Docker》 之后,反响不错,也上了热榜。本来是想直接整理一下容器编排工具 Docker Swarm 和 K8s 博文的,但是半路杀出了这个活动😂,为表敬意,先参与一波吧。 本文主要介绍一下容…

HTML 全面入门教程:从基础到高级

目录 一、基本结构和标签1. HTML 文档结构2. 常用标签 二、表单和输入元素1. 表单标签&#xff08;<form>&#xff09;2. 输入元素3.实例 三、样式和布局1. 内联样式2. 内部样式表3. 外部样式表 四、多媒体和嵌入内容1. 图像2. 音频和视频3. 嵌入内容 五、语义化标签语义…

【高频电子线路课程设计】调幅发射机

目录 高频电子线路课程设计 摘要&#xff1a; 1绪论 1.1设计的作用和目的 2调幅发射机的主要性能指标 2.1调幅发射机的工作原理 3小功率调幅发射机的设计 3.1方案的选择 3.1.1简易调幅发射机的工作原理框图 3.1.2功率分配及电源电压确定 3.1.3各级晶体管的选择 3.2…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…

DAY 79 云原生DOCKER的基本原理及镜像管理

Docker概述 云计算涌现出很多改变传统IT架构和运维方式的新技术&#xff0c;比如虚拟机、容器、微服务、Serverless&#xff08;无服务&#xff09;&#xff0c;无论这些技术应用在哪些场景&#xff0c;降低成本、提升效率是云服务永恒的主题。 1.运行物理机&#xff0c;也称…

基于深度学习的高精度奶牛检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度奶牛检测识别系统可用于日常生活中或野外来检测与定位奶牛目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的奶牛目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

pytorch 绘制一维热力图

热力图 热力图&#xff08;Heat Map&#xff09;是指用 X 轴 和 Y 轴 表示的两个分类字段确定数值点的位置&#xff0c;通过相应位置的矩形颜色去表现数值的大小&#xff0c;颜色深代表的数值大。 热力图是非常特殊的一种图&#xff0c;可以显示不可点击区域发生的事情。热力…

springcloud整合gateway

1.新建gateway模块 添加gateway依赖 2.添加gateway配置 2.1配置转发地址 2.2 配置断言规则 3.启动 order-nacos,stock-nocas,gateway模块 3.集成nacos 3.1添加nacos依赖 3.2 配置uri,添加nacos 3.3重启gateway服务

密码学中的SM2

目录 概述 功能 密钥生成 基点G的生成 模数p 密钥生成过程 加解密 加密过程&#xff1a; 解密过程&#xff1a; 数字签名 概述 对第5步r的计算方式分析 对第6步s的计算方式分析 加密模式 优缺点 论文和研究方向推荐 论文 研究方向 概述 SM2是中国密码学算法…

Jupyter notebook运行环境创建

进入到jupyter notebook,没找到自己之前创建的环境xzc_pytorch 进入到Anaconda prompt,输入如下命令 (xzc_pytorch) C:\Users\xzc> conda install ipykernel安装完后&#xff0c;重启jupyter notebook发现还是没有 &#xff0c;此时选择手动创建&#xff0c;在base环境下执…

Linux系统之部署Etherpad文档编辑器

Linux系统之部署Etherpad文档编辑器 一、Etherpad介绍1.1 Etherpad简介1.2 Etherpad特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装Node.js 四、部署Node.js 环境4.1 下载Node.js安…

DAY 76 分布式监控平台:zabbix

市场上常用的监控软件&#xff1a; 传统运维&#xff1a;zabbix、 Nagios云原生环境&#xff1a; Prometheus &#xff08;go语言开发的&#xff09; zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去…

html实现好看的个人介绍,个人主页模板5(附源码)

文章目录 1.设计来源1.1 主界面1.2 我的介绍界面1.3 我的能力界面1.4 项目案例界面1.5 联系我界面 2.效果和源码2.1 动态效果2.2 源代码2.3 源代码目录 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/13127331…

uniapp——Android 异常: failed to connect to localhost/127.0.0.1

bug解决——携带出现&#xff1a; Waiting to navigate to: /pages/……, do not operate continuously: /pages/…… failed to connect to localhost/127.0.0.1 解决方法&#xff1a; 我的报错&#xff1a;主要是failed to connect to localhost/127.0.0.1引发的Waiting …

Python3 flask-socketio 整合vue

1. 前端说明 前端追加了vue-socket.io的依赖 更新package.json及package-lock.json后&#xff0c;需要补充库 2. 后端说明 服务端需要安装的python包 suse python 3.6.12 Flask_SocketIO-4.3.1-py2.py3-none-any.whl python_socketio-4.6.0-py2.py3-none-any.whl python_…

python爬虫学习简记

目录 页面结构的简单认识 爬虫概念理解 urllib库使用 爬虫解析工具xpath JsonPath Selenium requests基本使用 scrapy 页面结构的简单认识 如图是我们在pycharm中创建一个HTML文件后所看到的内容 这里我们需要认识的是上图的代码结构&#xff0c;即html标签包含了hea…