Reids + PHP应用
一、消息队列原理、概念
1.1 消息队列概念
a、队列结构的中间件
b、消息放入后不需要立即处理
c、由订阅者/消费者按照顺序处理
1.2 核心结构
1.3 应用场景
冗余:比如订单系统,需要严格的做数据转换和记录,消息队列可以持久化的把这些信息存储在消息队列中
解耦:比如两套系统,彼此独立
流量削峰:秒杀和抢购,配合缓存来使用消息队列
异步通信:
排序保证:
1.4 常见队列实现优缺点
队列介质:
1.5 消息处理触发机制
二、解耦案例-队列处理订单系统和配送系统
2.1 架构设计
2.2 程序流程
三、流量削峰案例 - Redis的List类型实现秒杀
3.1 架构设计
3.2 代码设计
用户秒杀的代码
模拟秒杀生成的uid参数
读取redis队列,数据写进数据库的代码
四、RabbitMQ - 更专业的消息系统实现方案
4.1 RabbitMQ的架构和原理
4.2 RabbitMQ安装
4.3 Work Queue
五、PHP秒杀系统整体设计
5.1 本质
高并发、高可用
5.2 原理知识介绍
减而治之:
a、CND原理
b、nginx限流
c、异步队列
分而治之:
a、nginx负载均衡
5.3 特征与难点分析
特征:
a、写强一致性:卖出的商品、计数的数量一致
b、读弱一致性:比如12306抢票的时候确实看到有票,下单的时候却没了
难点:
a、极致性能的实现
b、高可用的保证
5.4 秒杀系统核心实现
1. 极致性能的读服务实现:
a场景、订单详情页读取,通过CDN加速方式减轻服务器压力
b场景、实时读取总库存
2. 极致性能的写服务实现:
a场景:扣库存
3. 极致性能的排队进度查询实现
比如12306抢票,可能会有一个排队的进度,用户频繁去查询还剩多少分钟,这么一个服务
4. 链路流量如何优化
比如流量到达LVS层、接入层、service层
5.5 兜底-高可用
1. 高可用的标准
2. 请求链路中每层高可用的实现原理
3. 限流、一键降级、自动降级实现
5.6 接口压力测试
平时使用最多的ab压测工具,通过 “Requests per second:”这一项数据值分析接口和机器性能状态
5.7 限流
1. nginx限流配置
区别:上面一个限制并发数,下面一个限制单个ip请求数
2. 限流算法介绍
a、令牌桶算法
b、漏桶算法
5.8 CND介绍
提高读源站性能一大利器
CND原理:
CDN - 普通域名访问
CDN - DNS解析原理
注意:不同地域的客户端访问同一个域名的时候,拿到的CND地址是不一样的,基本是距离客户端比较近的CDN服务器地址,通过这样的方式来实现一定的加速;而CDN服务器也会把源站上的内容做一定时间的缓存,通过这样的方式来降低源服务的qps,提高读服务性能
5.9 大型网站架构
5.10 秒杀系统使用场景
5.10.1 秒杀系统 - 特点介绍
a、抢购人数远远多于库存,读写并发极大
b、库存少,有效写少
c、写强一致性,商品不能超卖,也就是说库存减少量与创建订单量必须一致的
d、读一致性要求并不高
5.10.2 秒杀系统 - 难点
稳定性难:
a、高并发下,某个小依赖可能直接造成雪崩
b、流量预期难精确,过高也会造成雪崩
c、分布式集群,机器多,出故障的概率高
准确性难:
a、库存、抢购成功数、创建订单数之间一致性
高性能难:
a、有限成本下需要做到极致的性能
5.10.3 秒杀系统 - 架构原则
稳定性:
高性能:
5.11 秒杀服务核心实现
5.11.1 该怎样去设计?
基本需求:
基本需求 - 场景举例:
基本需求 - 扣库存方案:
预扣库存方案实现:
极高并发下怎么做到单服务极致性能:
I/O主要包含:
无I/O怎么做?
普通下单业务实现:
去I/O后的业务实现:
并发量过大单服务还是扛不住怎么办?
本地减库存,集群机器挂了怎么办?怎么保证不少卖?
单服务扣库存实现:
1、初始化库存到本地库存
2、本地减库存,成功则进行统一减库存,失败则返回
3、统一减库存成功则写入mysql,异步创建订单
4、告知用户抢购成功
创建订单、支付订单服务:
基本需求 - 读取商品信息: