Java教程

秒杀系统设计与思考

本文主要是介绍秒杀系统设计与思考,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

秒杀系统要解决什么

  1. 削峰填谷,将大批量的请求分批流向DB,避免DB被冲垮
  2. 兼顾性能的同时,保证下单时查验库存与扣减库存的原子性,避免超卖少卖问题
  3. 隔离资源,限流,保护除了秒杀系统外的其他系统正常运行。

秒杀系统怎么设计

前期准备

  1. 前端防刷。减少用户频繁点击带来的不必要流量。
  2. 网关限流。根据IP进行限流,阻挡黄牛和恶意用户。

技术选型

  1. 消息中间件,主要用于削峰填谷,主流的kafka、rabbitmq、rocketmq皆可。我这边选我自己比较熟悉的rabbitmq,实测单机可达10000TPS,可满足绝大多少场景。
  2. 库存采用Redis,redis本身对请求保证原子性,利用lua脚本可以同时进行校验库存和扣减库存两步操作
  3. 数据库依旧使用Mysql,做好分库分表提高写入速率。由于是秒杀,可以将sync_binlog = 0、innodb_flush_log_at_trx_commit = 0 减少redolog和binlog刷盘次数。进一步提高性能。但是风险是mysql崩溃时事务会丢失,不过考虑到秒杀一般都给2倍到3倍的资源,又有削峰,所以可以不考虑mysql崩溃的场景。

流程设计

  1. 秒杀参与接口。
  2. 订单消费者。
  3. 订单轮询接口。

魏王待续

这篇关于秒杀系统设计与思考的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!