电商--抢购总结

文章目录

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

业务流程

在这里插入图片描述

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

业务难点

技术难点

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

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

技术方案

技术方向

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

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

  • 充分利用使用缓存

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

具体落地

客户端流控

客户端(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平台体能哪些能力来帮助定位出出现性能的点在哪。对于压测这里不详细展开介绍。

监控

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

总结

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

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

参考文献

秒杀系统架构优化思路

如何设计秒杀系统?

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

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

相关文章

Docker 概述与命令操作

一、Docker 概述 1、Docker的概念 • Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 • Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机” • Docker 的容器技术可以在一台主机上轻松为任何应用创建一…

【4】Midjourney常用技巧

【常用技巧】 本篇主要讲述MJ的常用技巧,围绕着一些常用指令的使用方法展开。 【版本切换】 在使用MJ时,最常用的技巧之一是版本切换。你可以在输入提示后添加"--v"加上相应的数字来实现版本切换。通常我默认使用MJ 4,偶尔会使用…

信创办公–基于WPS的EXCEL最佳实践系列 (设置多级列表)

信创办公–基于WPS的EXCEL最佳实践系列 (设置多级列表) 目录 应用背景操作步骤1、删除重复项2、部门绑定3、填入相关信息 应用背景 当我们在使用电子表格时,很多类型重复输入很麻烦,看起来也很复杂,我们就可以设置多级…

PCB材料选择与性能比较

PCB板被广泛应用于电子行业,作为电子设备的重要组成部分之一,负责连接各种电子元件。PCB板的性能直接影响着电子设备的质量和稳定性。而PCB板的材料选择则是影响PCB板性能的关键因素之一。本文将对常见PCB材料进行比较分析,以便于选择适合的材…

SQL-基础

SQL-小基础 1 SQL简介 英文:Structured Query Language,简称 SQL结构化查询语言,一门操作关系型数据库的编程语言定义操作所有关系型数据库的统一标准对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方&#xff…

第9章:SpringMVC的拦截器

一、拦截器 1.拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行SpringMVC中的拦截器需要实现HandlerInterceptorSpringMVC的拦截器必须在SpringMVC的配置文件进行配置 ①创建拦截器,继承接口HandlerInterceptor. Component public class FirstIntercep…

Log4j2漏洞复现补丁绕过

漏洞复现 这里我一共使用了两个jdk版本 8u202的情况比较特殊,其实我今天凌晨在家里用的也是8u202的版本,失败了。今天来公司也是用的8u202版本的jdk,成功了。我仔细研究了两者的不同,我发现唯一不同的就是我公司这个idea启的proie…

Spring Cloud Feign实战

概述 Feign是一种声明式、模板化的HTTP Client,目标是使编写Java HTTP Client变得更简单。Feign通过使用Jersey和CXF等工具实现一个HTTP Client,用于构建REST或SOAP的服务。Feign还支持用户基于常用的HTTP工具包(OkHTTP、HTTPComponents&…

全志V3S嵌入式驱动开发(开发环境再升级)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们陆陆续续开发了差不多有10个驱动,涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的…

Java中查看堆里的信息

文章目录 前言1 建议无脑的做一件事2 jmp命令3 导入 hprof 文件到Visual VM 中4 查看对象属性值 前言 日常工作中,我们可能会遇到这样的场景: java项目发生了OOM;想知道在某种场景下,堆里的信息,从而确认一些代码功能…

JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解析预览图像

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各…

第五章 结构化设计

结构化设计的概念 1. 设计的定义 一种软件开发活动,定义实现需求规约所需的软件结构。 结构化设计分为: (1)总体设计:确定系统的整体模块结构,即系统实现所需要的软件模块以及这些模块之间的调用关系。 (2)详细设计:…

【C++】类型转换

目录 一、C语言中的类型转换 二、C中的类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast 三、RTTI 1.typeid运算符 2. decltype 一、C语言中的类型转换 在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类…

什么是域控服务器?域控服务器功能?部署域控需要考虑因素?域控组策略功能?

一、什么是域控制服务器? 域控制器(Domain Controller)是在Windows Server操作系统上运行的一个服务角色,它用于管理和控制一个或多个计算机的安全策略、用户身份验证和授权等任务。域控制器通常是用于企业网络中的主要身份验证和…

macOS Sonoma 14beta With OpenCore 0.9.3 and winPE双引导分区黑苹果原版镜像

镜像特点(原文地址:http://www.imacosx.cn/113888.html) 完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要…

华为OD机试真题 JavaScript 实现【IPv4地址转换成整数】【2023 B卷 100分】

一、题目描述 存在一种虚拟 IPv4 地址,由4小节组成,每节的范围为0~255,以#号间隔, 虚拟 IPv4 地址可以转换为一个32位的整数,例如: 128#0#255#255,转换为32位整数的结果为2147549183&#xff0…

vue制作自己的组件库(仿ElementUI)

1.首先自己创建个新的vue项目,之后更改下目录形式,将src文件更改为examples,这里是专门放组件展示的md文件,packages文件里是放自己写的组件代码 2.然后是开始配置vue.config.js文件 ,其中md-loader是读取md文件的相关…

【C/C++】带你快速掌握 使用—增强for(范围for循环)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

MySQL 存储过程

1 什么是存储过程 MySQL 5.0 版本开始支持存储过程存储过程&#xff08;Stored Procedure&#xff09;是一种在数据库中存储复杂程序&#xff0c;以便外部程序调用的一种数据 库对象。存储过程是为了完成特定功能的SQL语句集&#xff0c;经编译创建并保存在数据库中&#xff0…

【c语言进阶】深入挖掘数据在内存中的存储

深入挖掘数据在内存中的存储 数据类型介绍数据类型基本分类及其大小 整形在内存中的存储方式原码、反码、补码大小端介绍判断一个系统是大端还是小端 char与unsigned char值范围与图解整形存储相关练习题 浮点数在内存中的存储方式浮点数存储规则案列 结语 铁汁们&#xff0c;今…
最新文章