php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 453|回复: 0

如何设计一个秒杀系统?

[复制链接]

2670

主题

2677

帖子

9495

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
6703
贡献
0
注册时间
2021-4-14
最后登录
2024-5-15
在线时间
674 小时
QQ
发表于 2022-6-7 08:55:14 | 显示全部楼层 |阅读模式
秒杀系统主要是有三个特点高性能高并发高可用
从一次秒杀的流程出发,考虑秒杀系统的三个特点,那么就可以设计一个秒杀系统。
1. 秒杀页面获取
优化方案:
  • 动静分离。将页面的静态资源等部署到Nginx或者CDN,这样可以加快秒杀页面获取。
  • 静态资源合并获取。通过将多个请求合并为单个请求,一次获取多个静态资源,这样可以加快秒杀页面获取。
  • 服务降级。秒杀页面做服务降级处理,将商品推荐列表、评论等做降级处理,少显示或者不显示。秒杀页面需要登录才能查看,对未登录用户直接返回登录界面。
  • 服务监控。对流量进行监控,使用令牌桶算法等限流算法对流量进行控制。有必要时将部分任务进行熔断。
  • 页面数据缓存。将页面数据缓存到Redis中,减少数据库操作。
  • 秒杀连接加盐。使URL动态化,可以减少非法用户操作。
2. 商品下单
优化方案:
  • 前端/后端限流。前端/客户端防抖。限制时间间隔内的下单次数。
  • 防机器人刷单。对下单操作增加填写验证码步骤,如:55+44=?、“你好”的小写拼音、选出所有飞机等问题,将非法请求过滤掉。
  • 商品下单预扣库存。数据库表设计的时候需要设置锁库存字段。进行秒杀的时候,减少库存将在Redis中使用分布式锁进行操作。其它后续操作可以使用RabbitMQ进行操作。
  • 商品下单预扣库存(库存预热)可以添加延时队列。将超时商品转发到死信路由,然后进行操作。
  • 商品下单可以进行异步操作,如双次验价等操作可以使用多线程。
3. 支付
优化方案:
  • 将支付划分为一个单独的系统,只开放对应的支付接口。因为支付系统是金融敏感的,所以应该保证支付系统的高可用。
  • 回滚机制。建议使用分布式事务,对支付业务进行TCC事务,因为支付系统是金融敏感的。

于是,秒杀系统一般会引入MQ、Redis、MySQL、Nginx等中间件,需要对每个中间件进行高性能高并发高可用的分析。
MQ
优化方案:
  • 集群部署。MQ系统一般都是集群部署的,进行镜像集群部署,可以提升系统的可用性。
  • 开启持久化。对MQ系统中的信息开启持久化,将其刷到硬盘内,防止宕机。
  • 关闭消费自动ACK,需要进行手动ACK。防止信息消费异常。
Redis
优化方案:
  • Redis进行读写分离,Master节点进行写操作,其他节点进行读操作。
  • Redis进行哨兵部署,让某一个节点宕机后可以迅速有机器顶替上。
  • Redis进行分片集群部署,让请求分布到每一台Redis机器上。
  • 开启持久化日志。AOF和RDB根据业务状况进行调整。
  • 一个系统可以有多个Redis集群,例如页面数据和商品下单两个方面的Redis可以用多个集群的Redis。
MySQL
优化方案:
  • 根据业务建立索引。唯一索引、普通索引、联合索引等。
  • 看业务是否有优化的地方,减少回表操作。
  • 分库分表。MySQL应该进行集群部署,单台Redis一般只有2000QPS左右。
    • 分库。使用MyCat或者ShardingSphere等进行分库,将操作通过算法分配到相对应的机器上面。
    • 分表。分表有垂直划分和水平划分两种。垂直划分是将部分字段分割到其它表上面。水平划分是将数据水平划分到同一数据库中的不同表上面,避免一个表上面的数据过大。
    • 一般来说,建议分32个库,每个库分32张表,这样完全能够满足大部分企业的需求。
  • MySQL的瓶颈是磁盘IO,可以更换固态硬盘。
Nginx
优化方案:
  • 动静分离。将静态资源部署到Nginx中,无需到其它中间件中查询。
  • Nginx可以开启限流操作。令牌桶和露铜算法都支持。
  • Nginx开启负载均衡,将服务请求打到不同的服务器上,降低单台服务器压力。

除了上面列出来的,还有很多的优化操作。
热点数据分离
热点商品和普通商品使用的系统可以隔离开来,这样即使秒杀系统宕机了,普通的商品下单也不会有任何问题。
  • 秒杀商品放到热点数据系统内。
  • 直播商品也可以放到热点数据系统内。
  • 流量监控。可以将下单比较多的商品放到热点数据系统内。
  • 商家上报。商家可以将未来可能售卖较多的商品上报,放到热点数据系统内。
  • 数据分析。分析以往数据,得出一些未来可能售卖较多的商品,放到热点数据系统内。

性能优化
最后可以进行机器上面的性能优化。
  • 更换CPU
  • 更换内存
  • 更换速度更快的硬盘
  • 更新Linux系统内核
  • 更新软件系统稳定版本
  • 关闭Linux上面一些无用的服务

秒杀系统主要是有三个特点高性能高并发高可用。只要对这三个点进行思考,那么就会慢慢得出一个秒杀系统。






上一篇:数据库、数据仓库之间的区别与联系
下一篇:2022全国高考天气地图出炉 8省区考生需警惕强降雨
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-5-16 09:42 , Processed in 0.156790 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表