关于两周的秒杀抢购项目学习笔记
QPS&PV的运算
SPU&SKU
如何快速熟悉一个项目
项目内容
系统架构
功能架构
技术架构
环境准备
业务流程
数据库内容
数据模型
表内容
- tb_sku
- tb_order
表字段分析
使用域名访问服务
为什么不用 IP 访问
提高性能策略
将数据从 MySQL 批量保存到 elasticSearch
提升导入性能(进一步提升整体性能)
数据迁移策略
将数据从 MySQL 迁移至 ES 索引库中,提升查询速度,实际上也是在提升性能
前端页面高QPS优化
数据直接查询 MySQL 及查询优化
- 查询优化:
使用索引(主要手段)
使用慢查询定位较慢的sql,在使用EXPLAIN进行分析
优化数据库结构(表拆分,使用中间表)
数据分库(sharding-jdbc操作多数据库)
使用查询缓存(MySQL8已废弃)
- 适用场景:
用户数量少
交互的数据量小
要求成本低
开发周期短
页面数据使用 Redis 缓存,提高访问速度
- 适用场景:
查询频率高
性能高、并发用户高
减轻数据库压力
- 缺点:
成本高
数据双写不一致问题
redis并发竞争问题
页面静态化+Nginx,再次提高访问速度
- 适用场景:
性能的优先级高(秒杀)
需要减轻后台服务压力
SEO搜索引擎优化
- 缺点:
可能需要大量硬盘
增加开发复杂度(例如翻页)
静态页过多会增加运维管理成本
数据实时性较差,不适合频繁操作
静态化+Nginx+CDN,流量分流和内容加速
CDN(内容分发网络)—— 由分布在不同区域的节点服务器群组成的分布式网络
- 优点:
提高企业站点的访问速度
不同运营商的用户同样快速
请求分流,减轻原站点web服务器的负载
有效防止恶意攻击
- 缺点:
成本较高
CDN服务商在某些地方可能没有服务器
CDN服务商可能被政府禁用IP
网站文件的安全性(需要交给第三方CDN)
- 注册并上传资源到CDN
注册七牛云账户
创建空间
上传静态资源到空间中
- 修改静态页html
在FreeMarker模板中,静态资源url改为CDN
重新生成静态页html
数据同步和访问日志实时收集
Canal数据同步
- Canal介绍
canal,译意为水道/管道/沟渠
主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
- 数据实时同步
索引+静态页动态更新
- Elastic-Job介绍
ElasticJob 是一个分布式调度解决方案,由 2 个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。
ElasticJob-Lite 定位为轻量级无中心化解决方案,使用jar的形式提供分布式任务的协调服务;ElasticJob-Cloud 使用 Mesos 的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。
ElasticJob 的各个产品使用统一的作业 API,开发者仅需要一次开发,即可随意部署。
- 索引+静态页动态更新
访问日志实时收集
-
开发分析
-
开发环境准备
-
Lua+Kafka收集日志
负载均衡
OSI七层网络
物理层:
- 物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输;
- 将数据转化成0和1
数据链路层:
- 数据链路层通过物理网络链路提供数据传输。不同的数据链路层定义了不同的网络和协议特征,包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控;
- 规定了0和1的分包形式,确定了网络数据包的形式
网络层:
- 网络层负责在源和终点之间建立连接;
- 需要确定计算机的位置,IPv4,IPv6
传输层:
- 传输层向高层提提供可靠的端到端的网络数据流服务。
- 每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信(常用的 TCP/IP 协议)
会话层:
- 会话层建立、管理和终止表示层与实体之间的通信会话;
- 建立一个连接(自动的网络寻址)
表示层:
- 表示层提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别;
- 例如Linux下的QQ和Windows下的QQ可以通信(不同系统之间的通信)
应用层:
- OSI 的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等;
负载均衡分类
二层负载均衡(mac)
- 根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应
三层负载均衡(ip)
- 一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应
- 即一个ip对一个ip的转发, 端口全放开
四层负载均衡(tcp)
- 在三次负载均衡的基础上,即从第四层"传输层"开始, 使用"ip+port"接收请求,再转发到对应的机器。
七层负载均衡(http)
- 从第七层"应用层"开始, 根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。