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、告知用户抢购成功
创建订单、支付订单服务:

基本需求 - 读取商品信息:
