Press "Enter" to skip to content

PHP秒杀设计

课程介绍

关于高并发,秒杀系统

重难点内容和的讲解

  • CDN原理 nginx限流 异步队列
  • nginx负载均衡
  • 写强一致性,读弱一致性

总结与回顾

  • 掌握秒杀系统的核心实现
  • 系统高可用的方法论学习
  • 高并发场景的通用解决思路学习

压测工具的使用

yum -y install httpd-tools

Nginx限流配置

  • 按连接数限速,限并发数 ngx_http_limit_conn_module
  • 按请求速率限速,按照ip限制单位时间内的请求数 ngx_http_limit_req_module

限制并发数: limit_req_zone $binary_remote_addr zone=mylimit:10m rate:1r/s;

应用规则: limit_req zone=mylimit burst=1 nodelay

burst 允许几个等待

限流算法与CDN原理

  • 限流算法-令牌桶算法
    在桶中存入令牌,不存在则返回503
  • 限流算法-漏桶算法
    漏桶每次请求增加令牌,超出则返回503
  • 限流算法-计数器
    单位时间计数器计数即可,一般在应用程序中写的较多
  • CDN内容分发网络,缩短访问路径,减少源战压力,提高内容响应速度,为源战提供安全保护

大型网站架构

带权轮询,请求后将服务器权限降权,流量均摊

消息队列实际为链表,头插尾出,高并发下容易发生堵塞,为避免消息丢失,可通过写入实时消息队列进行延时处理

秒杀系统的重难点

  • 抢购人数多于库存,读写并发巨大
  • 库存少,有效写少
  • 写需强一致性,商品不能买超
  • 读强一致性要求不高

秒杀系统的架构

  • 减少第三方依赖,同时自身服务部署也许做到隔离
  • 压测,降级,限流方案,确保核心服务可用
  • 需健康检查机制,整个链路避免单点
  • 缩短单请求访问路径,减少IO
  • 减少接口数,降低吞吐数据量,请求次数减少

秒杀系统基本需求分析

  • 满足基本需求,做到单服务极致性能
  • 请求链路流量优化,从客户端到服务端每层优化
  • 稳定性建设
  • 扣库存,查库存,排队进度,查订单详情,创建订单,支付订单
  • 引发的问题
    下单减库存: 恶意下单&不会超卖
    支付减库存: 订单超卖,订单支付不了
    预扣库存: 不支付库存卖不出

方案: 先扣除库存,然后创建订单,支付,10分钟内不支付则取消订单,避免不支付库存卖不出问题

极致性能的扣库存服务如何实现

  • 拆解-扣库存与写订单分开
  • 用内存
  • 用本地内存

优点:把不必要的订单拦截掉

扣库存分布式实现方案

问题: 本地减库存,集群机器挂了怎么办

统一减库存

  • 初始化库存到本地库存
  • 本地减库存,成功则进行统一减库存,失败则返回
  • 统一减库存成功则写入MQ,异步创建订单
  • 告知用户抢购成功

扣库存代码演示

通过lua脚本解决超卖问题,异步队列提高性能

商品信息页及抢购进度查询实现

  • 与库存服务隔离
  • 商品库一主多从提高读能力
  • 页面静态化+缓存+db实现即可

高性能的查库存服务实现

  • 读取本地库存,无则主动拉取一次,有则返回
  • 异步脚本定时同步库存至本地

基本需求实现总结

  • 读商品详情
  • 度库存
  • 读排队进度
  • 扣库存
  • 写订单

链路如何实现漏斗形流量

  • 客户端 CDN加速,分片削峰
  • 接入层 限制用户请求次数,分摊流量
  • 服务 集群化部署,本地库存,写订单排队
  • 数据 读写分离