百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

如何优化一个秒杀项目?(秒杀实现思路)

liuian 2025-05-05 17:01 41 浏览

问题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

相关推荐

win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
  • win10系统故障修复工具(win10系统的故障修复界面)
天猫积分兑换根本抢不到(2021天猫积分兑换根本抢不到)

因为天猫积分的东西是有限的,但是很多人想要它们。如果你想抢到它,你最好注意启动秒杀的时间,在你启动倒计时时做好准备,并立即点击交换验证码,然后点击确认。一般最慢的时间是十秒内甚至四五秒内下单,五分钟内...

win10任务管理器未响应(win10任务管理器没反应)

未响应这种情况应该是:1、说明程序是正在运行,但由于是系统运行内存不足,或者病毒、垃圾等造成的系统卡顿了。2、可以尝试重启系统、杀毒、清理垃圾即可。解决方法一:双击“此电脑”我的电脑的时候,出现资源管...

新电脑装win7进不了系统(新电脑安装win7系统启动不了)
新电脑装win7进不了系统(新电脑安装win7系统启动不了)

解决方法:1、开机按F8,选择“最好一次正确配置”尝试修复。2、开机按F8,选择“安全模式”尝试修复。3、如果方法1,2不能修复,通过系统还原或者重新安装系统修复。二、如果软件无法修复,仍然无法启动,那么就是硬件故障原因造成的。比如硬盘、主...

2025-12-25 21:55 liuian

台式键盘锁住了打不了字怎么解锁
台式键盘锁住了打不了字怎么解锁

1.找到在键盘上靠左侧的位置,有一个fn的键,按住fn键。2.然后找到键盘最上面f8的键,把fn和f8一起按住,即可完成操作。3.然后此时看到键盘已经解除锁定,就可以可以正常输入了,这样就完成了键盘的解锁操作。...

2025-12-25 21:05 liuian

怎么超频显卡(显卡怎么超频使用)

显卡超频犯法如下:1、首先是显卡体质的检测,如果不知道显卡的体质,盲目加电压或者频率很容易导致超频的失败,检测显卡体质需要用到软件超频和拷机软件。2、接下来是BIOS准备阶段,用户可以选择从现有显卡提...

自动关机怎么设置win10指令(win10设置自动关机代码)

1最简单的方法是通过系统自带的计划任务来设置自动开关机。2打开‘任务计划程序’,选择‘创建基本任务’,按照提示完成设置,可以选择定时执行或在特定条件下执行。3另外也可以通过第三方软件来实现自动开...

苹果系统修复软件(iphone修复软件)

牛学长苹果修复工具是一个知名的修复工具,经过多年的发展和改进,已经被广大用户验证为靠谱可信赖的工具。它具有强大的修复功能,可以解决苹果设备的各种问题,如系统崩溃、黑屏、无法开机等。该工具采用先进的技术...

硬盘损坏的原因(硬盘损坏严重怎么处理)

导致电脑硬盘坏的原因有以下几点:1、经常性的非正常关机、断电等情况都会导致硬盘出现坏块,突然停电后又马上恢复最容易引起系统故障,严重的就会让硬盘直接物理损坏。2、电压不稳定,很容易造成物理坏道。3、灰...

win10调制解调器出现错误(window10调制解调器报告了一个错误)

方法一1、按下win+i组合键打开windows设置,在设置界面点击网络和internet;2、在左侧点击【拨号】按钮;3、在右侧拨号下方点击宽带链接,然后点击【高级选项】;4、打开...

台式电脑如何设置ip地址(设置台式机ip地址)
台式电脑如何设置ip地址(设置台式机ip地址)

方法1、打开电脑的控制面板,进入设置界面。2、然后找到网络和Internet选项,点击进入。3、进入之后点击选择网络和共享中心。4、点击左侧的更改适配器设置栏。5、然后找到需要设置的网络连接,鼠标右键选择属性。6、然后双击Internet协...

2025-12-25 18:05 liuian

centos系统安装教程(centos安装总结)

之前在线在Debian内安装Gentoo,大体步骤如下:1.mkdir/new,chroot进去正常安装新系统。2.将静态编译的busybox放到根目录。3.停掉所有服务,umount所有有关目录。...

不用电脑怎么恢复(不用电脑怎么恢复出厂设置)

操作方法01方法一:通过设置重置电脑使用快捷键Windows+A,点击所有设置,点击更新系统-恢复,重置此电脑点开始。02选择仅保留我的文件,删除应用和设置,提示窗口会显示出将被删除的应用,点击下一步...

最强视频播放器(2020视频播放器排行榜前十名)

应该是MXPlayer。他是一款安卓版上十分强悍的视频播放器,他以解码性能强、兼容性高而闻名,并且,对视频字幕的支持更是堪称一绝,支持在线匹配,对特效字幕的支持也是非常的高的。作为一款优质的手机视频播...

三星固态驱动官网(三星固态官方软件)

三星手机序列号查询官网是http://www.samsung110.com/。手机序列号(S/N号)查询方法:设置-关于手机-状态-序列号(序号)。或通过以下方式查询:通过机器包装盒上的标贴查询用...