23 09 2022

Reids + PHP应用


一、消息队列原理、概念

            1.1 消息队列概念

                a、队列结构的中间件

                b、消息放入后不需要立即处理

                c、由订阅者/消费者按照顺序处理

            1.2 核心结构

                image.png

            1.3 应用场景

                冗余:比如订单系统,需要严格的做数据转换和记录,消息队列可以持久化的把这些信息存储在消息队列中

                解耦:比如两套系统,彼此独立

                流量削峰:秒杀和抢购,配合缓存来使用消息队列

                异步通信:

                排序保证:

            1.4 常见队列实现优缺点

                队列介质:

                image.png

            1.5 消息处理触发机制

                image.png

二、解耦案例-队列处理订单系统和配送系统

            2.1 架构设计

                image.png

            2.2 程序流程

                image.png

三、流量削峰案例 - Redis的List类型实现秒杀

            3.1 架构设计

                image.png

            3.2 代码设计

                image.png

                用户秒杀的代码

                image.png

                image.png

                模拟秒杀生成的uid参数

                image.png

                读取redis队列,数据写进数据库的代码

                image.png

                image.png

                

四、RabbitMQ - 更专业的消息系统实现方案

            4.1 RabbitMQ的架构和原理

            image.png

            4.2 RabbitMQ安装

                image.png

            4.3 Work Queue

                image.png

                

            

五、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限流配置

                    image.png

                    区别:上面一个限制并发数,下面一个限制单个ip请求数

                    image.png

                2. 限流算法介绍

                    a、令牌桶算法

                    image.png

                    image.png

                    image.png

                    b、漏桶算法

                    image.png

                image.png

            5.8 CND介绍

                image.png

                提高读源站性能一大利器

                CND原理:

                image.png

                image.png

                CDN - 普通域名访问

                image.png

                CDN - DNS解析原理

                image.png

                image.png

                image.png

                image.png

                注意:不同地域的客户端访问同一个域名的时候,拿到的CND地址是不一样的,基本是距离客户端比较近的CDN服务器地址,通过这样的方式来实现一定的加速;而CDN服务器也会把源站上的内容做一定时间的缓存,通过这样的方式来降低源服务的qps,提高读服务性能

            5.9 大型网站架构

            image.png


            5.10 秒杀系统使用场景

                image.png

                5.10.1 秒杀系统 - 特点介绍

                a、抢购人数远远多于库存,读写并发极大

                b、库存少,有效写少

                c、写强一致性,商品不能超卖,也就是说库存减少量与创建订单量必须一致的

                d、读一致性要求并不高

                

                5.10.2 秒杀系统 - 难点

                稳定性难:

                    a、高并发下,某个小依赖可能直接造成雪崩

                    b、流量预期难精确,过高也会造成雪崩

                    c、分布式集群,机器多,出故障的概率高

                准确性难:

                    a、库存、抢购成功数、创建订单数之间一致性

                高性能难:

                    a、有限成本下需要做到极致的性能

                5.10.3 秒杀系统 - 架构原则

                稳定性:

                 image.png

                高性能:

                    image.png

                5.11 秒杀服务核心实现

                5.11.1 该怎样去设计?

                image.png

                基本需求:

                image.png

                基本需求 - 场景举例:

                image.png

                基本需求 - 扣库存方案:

                image.png

                预扣库存方案实现:

                image.png

                极高并发下怎么做到单服务极致性能:

                image.png

                I/O主要包含:

                image.png

                无I/O怎么做?

                image.png

                普通下单业务实现:

                image.png

                去I/O后的业务实现:

                image.png

                并发量过大单服务还是扛不住怎么办?

                image.png

                本地减库存,集群机器挂了怎么办?怎么保证不少卖?

                image.png

                单服务扣库存实现:

                1、初始化库存到本地库存

                2、本地减库存,成功则进行统一减库存,失败则返回

                3、统一减库存成功则写入mysql,异步创建订单

                4、告知用户抢购成功

                

                创建订单、支付订单服务:

                image.png

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

                image.png