如何优化一个秒杀项目?


如何优化一个秒杀项目?

文章插图
 
问题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.静态请求CDN1.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:客户端发送的匹配资源最后修改时间的标识符

如何优化一个秒杀项目?

文章插图
 
三种刷新方式