如何优化一个秒杀项目?(秒杀实现思路)
liuian 2025-05-05 17:01 33 浏览
问题1:使用jmeter性能压测,定位瓶颈代码
步骤流程:线程组--->Http请求--->查看结果树--->聚合报告
tips:host的文件--->优先调用映射,减少DNS的时间
默认内嵌Tomcat配置---->参数调优
server.tomcat.accept-count:等待队列长度,默认100
server.tomcat.max-connections:最大可被连接数,默认10000
server.tomcat.max-threads:最大工作线程数,默认200
server.tomcat.min-spare-threads:最小工作线程数,默认10
默认配置下,连接超过10000后出现拒绝连接情况
默认配置下,触发的请求超过200+100后拒绝处理
定制化内嵌Tomcat开发--->keepalive
keepAliveTimeOut:多少毫秒后不响应的断开keepalive
maxKeepAliveRequests:多少次请求后keepalive断开失效
使用
WebServerFactoryCustomizer定制化内嵌tomcat配置
MySql数据库QPS容量问题
◆主键查询:千万级别数据=1-10毫秒
◆唯一索引查询:千万级别数据=10-100毫秒
◆非唯一索引查询:千万级别数据=100-1000毫秒
◆无索引:百万条数据=1000毫秒+
问题2:分布式扩展
1.单机容量问题,水平扩展
- mysql数据库开放远端连接
- 服务端水平对称部署
- 验证访问
2.使用OpenResty
使用Nginx做为静态资源服务器+nginx反向代理负载均衡
Nginx的高性能原因:
- epoll多路复用
- master-worker模型
- 协程机制 依附于线程的内存模型,切换开销小 遇阻塞及归还执行权 代码同步无需加锁
3.分布式会话管理
传统的会话管理
基于cookie传输sessionid:java tomcat容器session实现
基于token传输类似sessionid:java代码session实现
使用redis实现分布式会话存储
基于cookie传输sessionid:java tomcat容器session实现迁移到redis
基于token传输类似sessionid:java代码session实现迁移到redis
问题3:查询优化技术
1.掌握多级缓存的定义
缓存设计
用快速存取设备
用内存将缓存推到离用户最近的地方
脏缓存清理
2.多级缓存
1.redis缓存:单机、哨兵、集群----(注意序列化问题)
2.热点内存本地缓存--Guava cache
- 可控制的大小和超时时间
- 可配置的lru策略
- 线程安全
3.nginx proxy cache缓存--实际效果还不如本地缓存 ,可以用shared dic (2000)
- 依靠文件系统存索引级的文件
- 依靠内存缓存文件地址
4.nginx lua缓存
- nginx lua挂载点---将简单的逻辑放到Nginx中处理,避免调用java代码 init-by_lua:系统启动时调用 init-worker-by_lua:worker进程启动时调用 setby_lua:nginx变量用复杂lua return rewrite-by_lua:重写url规则 access_by_lua:权限验证阶段 content-by_lua:内容输出节点
- OpenResty OpenResty由Nginx核心加很多第三方模块组成,默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。 借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。 OpenResty提供了大量组件如Mysql,Redis,Memcached等等使在Nginx上开发Web应用更方便更简单。
shared dic:共享内存字典,所有worker进程可见,Iru淘汰 ---更新操作不强 (3500)
使用openresty对redis支持,可以连接到从机,只读不写。(3500)
问题4:静态资源的优化
1.静态请求CDN
1.DNS用CNAME解析到源站
2.回源缓存设置
cache control响应头
- private:客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age=xxx:缓存的内容将在xxx秒后失效
- no-cache:强制向服务端再验证一次
- no-store:不缓存请求的任何返回内容
有效性验证
- ETag:资源唯一标识
- If-None-Match:客户端发送的匹配Etag标识符
- Last-modified:资源最后被修改的时间
- If-Modified-Since:客户端发送的匹配资源最后修改时间的标识符
三种刷新方式
- 回车刷新或a链接:看cache-control对应的max-age是否仍然有效,有效则直接from cache,若cache-control中为no-cache,则进入缓存协商逻辑
- F5刷新或command+ R刷新:去掉cache-control中的max-age或直接设置max-age为0,然后进入缓存协商逻辑
- ctrl+F5或commond+shift+R刷新:去掉cache-control和协商头,强制刷新
CDN自定义缓存策略
- 可自定义目录过期时间
- 可自定义后缀名过期时间
- 可自定义对应权重
- 可通过界面或api强制cdn对应目录刷新(非保成功)
2.静态资源部署策略
css,js,img等元素使用带版本号部署,例如a.js?v=1.0不便利且维护困难
css,js,img等元素使用带摘要部署,例如a.js?v=45edw存在先部署html还是先部署资源的覆盖问题(先后问题)
css.js,img等元素使用摘要做文件名部署,例如45edw.js,新老版本并存且可回滚,资源部署完后再部署html(==好==)
对应静态资源保持生命周期内不会变,max-age可设置的很长,无视失效更新周期
html文件设置no-cache或较短max age,以便于更新
html文件仍然设置较长的max age,依靠动态的获取版本号请求发送到后端,异步下载最新的版本号的html后展示渲染在前端
动态请求也可以静态化成json资源推送到cdn上 依靠异步请求获取后端节点对应资源状态做紧急下架处理
可通过跑批紧急推送cdn内容以使其下架等操作
3.全页面静态化
定义:在服务端完成html,css,甚至js的load渲染成纯html文件后直接以静态资源的方式部署到cdn上
phantomjs应用---类似于爬虫的原理
修改需要全页面静态化的实现,采用initView和hasInit方式防止多次初始化
编写对应轮讯生成内容方式
将全静态化页面生成后推送到cdn
问题5:交易优化技术之缓存库存
扣减库存缓存化
(1)活动发布同步库存进缓存
(2)下单交易减缓存库存
异步同步数据库------异步消息队列rocketmq
分布式事务
方案:
(1)引入库存操作流水
(2)引入事务性消息机制
问题6:流量削峰技术
秒杀令牌的原理和使用方式
- 秒杀接口需要依靠令牌才能进入
- 秒杀的令牌由秒杀活动模块负责生成
- 秒杀活动模块对秒杀令牌生成全权处理,逻辑收口
- 秒杀下单前需要先获得秒杀令牌
秒杀大闸的原理和使用方式
- 依靠秒杀令牌的授权原理定制化发牌逻辑,做到大闸功能
- 根据秒杀商品初始库存颁发对应数量令牌,控制大闸流量
- 用户风控策略前置到秒杀令牌发放中
- 库存售馨判断前置到秒杀令牌发放中
队列泄洪的原理和使用方式
- 排队有些时候比并发更高效
- 依靠排队去限制并发流量
- 依靠排队和下游拥塞窗口程度调整队列释放流量大小
本地OR分布式?
- 本地:将队列维护在本地内存中--负载不均衡
- 分布式:将队列设置到外部redis内
可以使用外部的分布式,如果出现了性能问题,可以使用降级策略,切换到本地。
问题7:防刷限流
为什么要进行限流?
- 流量远比你想的要多
- 系统活着比挂了要好
- 宁愿只让少数人能用,也不要让所有人不能用
限流方案
- 限并发
- 令牌桶算法(互联网公司常用)
- 漏桶算法
限流力度
- 接口维度
- 总维度---比接口的低20%左右
限流范围
- 集群限流:依赖redis或其他的中间件技术做统一计数器,往往会产生性能瓶颈
- 单机限流:负载均衡的前提下单机平均限流效果更好
传统防刷
- 限制一个会话(session_id,token)同一秒钟/分钟接口调用多少次:多会话接入绕开无效
- 限制一个ip同一秒钟/分钟接口调用多少次:数量不好控制,容易误伤
黄牛为什么难防
- 模拟器作弊:模拟硬件设备,可修改设备信息
- 设备牧场作弊:工作室里一批移动设备
- 人工作弊:靠佣金吸引兼职人员刷单
防刷策略
1.验证码
2.排队,限流,令牌均只能控制总流量,无法控制黄牛流量
3.不同端进行隔离,使用代码混淆,HTTPs等技术
4.设备指纹
◆采集终端设备各项参数,启动应用时生成唯一设备指纹
◆根据对应设备指纹的参数猜测出模拟器等可疑设备概率
5.凭证系统
◆根据设备指纹下发凭证
◆关键业务链路上带上凭证并由业务系统到凭证服务器上验证
◆凭证服务器根据对应凭证所等价的设备指纹参数并根据实时行为风控系统判定对应凭证的可疑度分数
◆若分数低于某个数值则由业务系统返回固定错误码,拉起前端验证码验身,验身成功后加入凭证服务器对应分数
问题8:单点登录
问题9:Mysql的性能优化
1.mysql应用性能优化拓展
通用性能优化---缓存+异步+批处理
写---批量写
- Sql编译N次和1次的时间与空间复杂度
- 网络消耗的时间复杂度
- 磁盘寻址的复杂度
读---索引
- 主键查询千万条记录1-10ms
- 唯一索引千万条记录10-100ms
- 非唯一索引千万条记录100-1000ms
- 无索引百万条记录1000ms+
mysql单机配置性能优化拓展
max_connection=1000
innodb _file_per_table=1
innodb_buffer_pool_size=1G
innodb_log_ file_size=256M
innodb_log_buffer_size=16M
innodb_flush_log_at_trx_commit=2(1---事务提交就刷盘)
2.mysql分布式配置性能优化拓展
mysql主从
- 开启bin_log
- 设置主从同步账号,配置主从同步
3.一致性原理
- 强一致性
- 弱一致性
- 最终一致性
CAP理论
- C:一致性
- A可用性
- P:分片性
base理论
- ◆Basic available:基本可用
- ◆S.:软状态
- ◆E:最终一致性
作者:gsyzh
链接:
https://juejin.im/post/5ed5adbd6fb9a047d3710da4
相关推荐
- 手机u盘有必要买吗(手机u盘需要什么软件)
-
网上卖的手机U盘大都是各地的实体数码店进行发货和销售的。他们采用的U盘质量和工厂生产的质量是一致的。并没有什么区别对待。而且由于网上销售费用比较低,所以他在售卖比实体数码店售卖的价格更低,所以这种手机...
- 电脑系统怎么下载到u盘中(电脑系统win7纯净版下载官方免费版最新版)
-
下载电脑系统,可以到电脑系统资源下载网站,找到下载页面的下载点,右击下载点,选择迅雷下载,可以把系统文件下载到硬盘里,然后插上U盘,将下载好的系统文件复制到U盘。另一种方法是,将迅雷软件的默认下载路径...
- 小米主题安装器(红米主题商店app下载安装)
-
很抱歉,一加九手机无法直接安装小米主题。因为一加九和小米手机使用的是不同的操作系统和主题引擎,它们之间不兼容。一加九使用的是基于Android的OxygenOS操作系统,而小米手机使用的是基于Andr...
- hp电脑恢复出厂系统(hp电脑恢复出厂系统操作)
-
在开始菜单的【设置】中找到【重置此电脑】的选项即可开始重置恢复到出厂设置;如果您需要整个硬盘格式化,可以选择其中的【删除所有文件】的选项,等待系统设置完成之后会重新进入新系统设置。以下是详细介绍:...
- ghost做c盘镜像的步骤(ghost制作镜像步骤)
-
共9个步骤:1、一般GHOST工具是在PE启动后使用,这个就是PE中GHOST所在路径,找到这个软件并运行。2、界面是英文版本的,因为软件的易操作易学习性,所以这个软件基本没有中文版版本,然后在弹出的...
- win10家庭版怎么激活系统(win10家庭版激活步骤)
-
win10家庭中文版怎么激活1.在win10系统桌面上,点击左下角的开始按钮选择设置选项进入。2.进入设置列表菜单,点击更新和安全选项进入。3.点击激活选项继续下一步操作。4.在弹出输入产品密钥的对话...
- office2010和2016区别(office2010和2016差别大不大)
-
一、指代不同1、word2010:Word2010是Microsoft公司开发的Office2010办公组件之一,主要用于文字处理工作。2、word2016::Word2016是Microsoft公司...
- win10官网下载教程(windows官网下载win10)
-
步骤1首先打开360安全浏览器步骤2在搜索框中输入“微软官网”,点击“搜索”按钮步骤3点击进入微软官网步骤4下滑界面,在下方可以看到可以下载的系统,此处以windows10企业版下载为例,点击这个版本...
- 恢复帝app下载(恢复帝app官方)
-
微信删除好友一般是不能恢复的,有时候在网上会看到一些关于微信删除好友可以帮助恢复的黑客,大多数都是骗人的,因此,再着急恢复好友也需要理智、谨防上当受骗。1.电源:首先确认摄像头通电是否正常状态,指示灯...
- 系统之家下载安装(系统之家安装版)
-
是靠谱的。系统之家(HomeSystem)广义上包含了电脑系统安装和手机系统安装,在之前手机软件还不是很普及的时候一般特指电脑系统安装,可如今手机用户大量的出现,安卓系统可以说超过Windows系统...
- win10正版系统官网原版纯净版老电脑
-
一,纯净版Win10系统是根据正版系统制作的,没有夹杂其它软件和驱动,和正版系统一样安装完后需要打各种驱动和根据安装常用软件。二,本质上纯净版Win10也是盗版系统,这是和正版系统最大的区别,而且可能...
- 十大最好用的浏览器(市面上最好用的浏览器)
-
1、谷歌chrone 谷歌美国Google公司开发的一款浏览器,谷歌浏览器的特点就是界面简洁,速度快不卡顿,内容全面,你想要找到内容上面都有,就是在安装插件的方面会比较麻烦,不过看在它那么好用的份...
- ipad充不上电了怎么办(ipad充不上电怎么办但显示在充电)
-
原因和解决办法: 1、ipad充不进去电很可能是充电线的原因,假如大家在给ipad充电的时候以前经常有过接触不良的情况,那么,你就需要考虑更换充电线了。 2、第二,就是接口问题了,或者说是充电...
- 怎样取消开机启动项目(如何取消开机启动程序)
-
在Windows操作系统中,有一些程序或服务可能会在计算机启动时自动运行,这些程序或服务也被称为开机启动项。如果您希望在启动Windows时减少计算机运行的程序或服务数量,您可以关闭一些开机启...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
