本文主要是介绍秒杀系统设计与思考,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
秒杀系统要解决什么
- 削峰填谷,将大批量的请求分批流向DB,避免DB被冲垮
- 兼顾性能的同时,保证下单时查验库存与扣减库存的原子性,避免超卖少卖问题
- 隔离资源,限流,保护除了秒杀系统外的其他系统正常运行。
秒杀系统怎么设计
前期准备
- 前端防刷。减少用户频繁点击带来的不必要流量。
- 网关限流。根据IP进行限流,阻挡黄牛和恶意用户。
技术选型
- 消息中间件,主要用于削峰填谷,主流的kafka、rabbitmq、rocketmq皆可。我这边选我自己比较熟悉的rabbitmq,实测单机可达10000TPS,可满足绝大多少场景。
- 库存采用Redis,redis本身对请求保证原子性,利用lua脚本可以同时进行校验库存和扣减库存两步操作
- 数据库依旧使用Mysql,做好分库分表提高写入速率。由于是秒杀,可以将sync_binlog = 0、innodb_flush_log_at_trx_commit = 0 减少redolog和binlog刷盘次数。进一步提高性能。但是风险是mysql崩溃时事务会丢失,不过考虑到秒杀一般都给2倍到3倍的资源,又有削峰,所以可以不考虑mysql崩溃的场景。
流程设计
- 秒杀参与接口。
- 订单消费者。
- 订单轮询接口。
魏王待续
这篇关于秒杀系统设计与思考的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!