字节面试:如何设计一个秒杀系统

秒杀系统主要是有三个特点高性能高并发高可用

从一次秒杀的流程出发,考虑秒杀系统的三个特点,那么就可以设计一个秒杀系统。

1. 秒杀页面获取

优化方案:

  1. 动静分离。将页面的静态资源等部署到Nginx或者CDN,这样可以加快秒杀页面获取。

  2. 静态资源合并获取。通过将多个请求合并为单个请求,一次获取多个静态资源,这样可以加快秒杀页面获取。

  3. 服务降级。秒杀页面做服务降级处理,将商品推荐列表、评论等做降级处理,少显示或者不显示。秒杀页面需要登录才能查看,对未登录用户直接返回登录界面。

  4. 服务监控。对流量进行监控,使用令牌桶算法等限流算法对流量进行控制。有必要时将部分任务进行熔断。

  5. 页面数据缓存。将页面数据缓存到Redis中,减少数据库操作。

  6. 秒杀连接加盐。使URL动态化,可以减少非法用户操作。

2. 商品下单

优化方案:

  1. 前端/后端限流。前端/客户端防抖。限制时间间隔内的下单次数。

  2. 防机器人刷单。对下单操作增加填写验证码步骤,如:55+44=?、“你好”的小写拼音、选出所有飞机等问题,将非法请求过滤掉。

  3. 商品下单预扣库存。数据库表设计的时候需要设置锁库存字段。进行秒杀的时候,减少库存将在Redis中使用分布式锁进行操作。其它后续操作可以使用RabbitMQ进行操作。

  4. 商品下单预扣库存(库存预热)可以添加延时队列。将超时商品转发到死信路由,然后进行操作。

  5. 商品下单可以进行异步操作,如双次验价等操作可以使用多线程。

3. 支付

优化方案:

  1. 将支付划分为一个单独的系统,只开放对应的支付接口。因为支付系统是金融敏感的,所以应该保证支付系统的高可用。

  2. 回滚机制。建议使用分布式事务,对支付业务进行TCC事务,因为支付系统是金融敏感的。


于是,秒杀系统一般会引入MQ、Redis、MySQL、Nginx等中间件,需要对每个中间件进行高性能高并发高可用的分析。

MQ

优化方案:

  1. 集群部署。MQ系统一般都是集群部署的,进行镜像集群部署,可以提升系统的可用性。

  2. 开启持久化。对MQ系统中的信息开启持久化,将其刷到硬盘内,防止宕机。

  3. 关闭消费自动ACK,需要进行手动ACK。防止信息消费异常。

Redis

优化方案:

  1. Redis进行读写分离,Master节点进行写操作,其他节点进行读操作。

  2. Redis进行哨兵部署,让某一个节点宕机后可以迅速有机器顶替上。

  3. Redis进行分片集群部署,让请求分布到每一台Redis机器上。

  4. 开启持久化日志。AOF和RDB根据业务状况进行调整。

  5. 一个系统可以有多个Redis集群,例如页面数据和商品下单两个方面的Redis可以用多个集群的Redis。

MySQL

优化方案:

  1. 根据业务建立索引。唯一索引、普通索引、联合索引等。

  2. 看业务是否有优化的地方,减少回表操作。

  3. 分库分表。MySQL应该进行集群部署,单台Redis一般只有2000QPS左右。

    1. 分库。使用MyCat或者ShardingSphere等进行分库,将操作通过算法分配到相对应的机器上面。

    2. 分表。分表有垂直划分和水平划分两种。垂直划分是将部分字段分割到其它表上面。水平划分是将数据水平划分到同一数据库中的不同表上面,避免一个表上面的数据过大。

    3. 一般来说,建议分32个库,每个库分32张表,这样完全能够满足大部分企业的需求。

  4. MySQL的瓶颈是磁盘IO,可以更换固态硬盘。

Nginx

优化方案:

  1. 动静分离。将静态资源部署到Nginx中,无需到其它中间件中查询。

  2. Nginx可以开启限流操作。令牌桶和露铜算法都支持。

  3. Nginx开启负载均衡,将服务请求打到不同的服务器上,降低单台服务器压力。


除了上面列出来的,还有很多的优化操作。

热点数据分离

热点商品和普通商品使用的系统可以隔离开来,这样即使秒杀系统宕机了,普通的商品下单也不会有任何问题。

  1. 秒杀商品放到热点数据系统内。

  2. 直播商品也可以放到热点数据系统内。

  3. 流量监控。可以将下单比较多的商品放到热点数据系统内。

  4. 商家上报。商家可以将未来可能售卖较多的商品上报,放到热点数据系统内。

  5. 数据分析。分析以往数据,得出一些未来可能售卖较多的商品,放到热点数据系统内。


性能优化

最后可以进行机器上面的性能优化。

  1. 更换CPU

  2. 更换内存

  3. 更换速度更快的硬盘

  4. 更新Linux系统内核

  5. 更新软件系统稳定版本

  6. 关闭Linux上面一些无用的服务


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

本文正在参与【内行知多少】 征文活动,一起来聊聊内行人才懂的那些事吧,高额牛币和百元京东卡等你来领~


#实习##搞技术你要知道##面试复盘##Java##春招#
小码哥高频面经及八股文 文章被收录于专栏

宝剑锋从磨砺出,梅花香自苦寒来,我是小码哥为你圆梦大厂少走弯路,值得关注。

全部评论
小马哥写的真不错,针对秒杀中的限流算法,这里再详细补充一个知识点:https://www.nowcoder.com/discuss/967100
4 回复 分享
发布于 2022-06-10 17:41
刚入职小白一枚,收藏,求指导
2 回复 分享
发布于 2022-06-09 13:44
学到了顶上去
2 回复 分享
发布于 2022-06-09 10:53
1 回复 分享
发布于 2022-06-09 14:39
向大佬看齐
1 回复 分享
发布于 2022-06-09 12:07
学习下,说不定我就是下一个大佬
1 回复 分享
发布于 2022-06-09 11:15
好文帮顶😁
1 回复 分享
发布于 2022-06-09 11:14
秒杀
1 回复 分享
发布于 2022-06-09 11:11
学习学习
2 回复 分享
发布于 2022-06-09 11:11
你问问字节的电商工程师他都不敢这么吹,我在快手每次直播秒杀都会有问题,可能大可能小没有简单的秒杀
2 回复 分享
发布于 2022-06-09 00:41
秒杀有点太大众了吧,感觉好多人做,面试官不会看出来吗
1 回复 分享
发布于 2022-07-05 17:09
我日。。。这么多年了,秒杀系统真是经久不衰。。。
点赞 回复 分享
发布于 2022-07-25 01:45
已经收藏了,什么时候发offer
点赞 回复 分享
发布于 2022-06-28 17:59
不考虑底层嘛?
点赞 回复 分享
发布于 2022-06-10 10:44
学习了
点赞 回复 分享
发布于 2022-06-09 19:58
点赞 回复 分享
发布于 2022-06-09 16:33

相关推荐

评论
79
718
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4332次浏览 75人参与
# AI面会问哪些问题? #
27943次浏览 556人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15247次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20225次浏览 342人参与
# 找AI工作可以去哪些公司? #
9157次浏览 235人参与
# 春招至今,你的战绩如何? #
65408次浏览 583人参与
# 厦门银行科技岗值不值得投 #
8039次浏览 188人参与
# 从事AI岗需要掌握哪些技术栈? #
9002次浏览 307人参与
# 中国电信笔试 #
32013次浏览 292人参与
# 你做过最难的笔试是哪家公司 #
33641次浏览 234人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340831次浏览 2174人参与
# 阿里笔试 #
178639次浏览 1316人参与
# 哪些公司真双非友好? #
69613次浏览 289人参与
# 机械人避雷的岗位/公司 #
62704次浏览 393人参与
# 第一份工作一定要去大厂吗 #
14677次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22092次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26258次浏览 310人参与
# 沪漂/北漂你觉得哪个更苦? #
9890次浏览 193人参与
# 应届生第一份工资要多少合适 #
20687次浏览 86人参与
# HR最不可信的一句话是__ #
6295次浏览 114人参与
# AI时代,哪个岗位还有“活路” #
11565次浏览 345人参与
# 春招你拿到offer了吗 #
831292次浏览 9987人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务