如何优化一个秒杀项目?(秒杀实现思路)
mhr18 2025-05-03 15:26 35 浏览 0 评论
问题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
相关推荐
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
- 备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627
-
一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...
- 增量备份修复物理备库gap(增量备份恢复数据库步骤)
-
适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...
- 一分钟看懂,如何白嫖sql工具(白嫖数据库)
-
如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...
- 「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布
-
前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...
- 您还在手工打造增删改查代码么,该神器带你脱离苦海
-
作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...
- Linux基础知识(linux基础知识点及答案)
-
系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...
- PL/SQL 杂谈(二)(pl/sql developer使用)
-
承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...
- 电商ERP系统哪个好用?(电商erp哪个好一点)
-
电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...
- 汽车检测线系统实例,看集中控制与PLC分布控制
-
PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...
- 苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品
-
钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)