一、分析
1.1 数据库准备
简单设计的话我们需要有一个产品,这个产品有相应的库存即可。
id | 产品 | 库存 |
---|---|---|
1 | 火箭 | 1000 |
2 | 大炮 | 800 |
3 | 坦克 | 600 |
访问量过高火或者MySQL配置文件中max_connections值过小,会产生“MySQL: ERROR 1040: Too many connections”的异常情况。考虑增加从服务器分散读压力,或者查看与设置max_connections:
show variables like'%max_connections%';
set global max_connections=1000 重新设置
1.2 redis准备
只有数据库实现秒杀功能会存在以下一些问题:
- 短时间内的大访问量对现有网站业务造成的冲击。
- 高并发下对服务器数据库造成的极大负载压力。
- 不能因为数据库宕机导致整个系统服务崩溃
我们需要将商品读到redis中,对于商品的消费,我们可以使用事务或者分布式锁watch来实现。
1.3 RocketMq准备
消息队列的作用:
- 削去秒杀场景下的峰值写流量——流量削峰
- 通过异步处理简化秒杀请求中的业务流程——异步处理
- 解耦,实现秒杀系统模块之间松耦合——解耦
生产者流控,因为broker处理能力达到瓶颈;消费者流控,因为消费能力达到瓶颈。
- 生产者流控:
- commitLog文件被锁时间超过osPageCacheBusyTimeOutMills时,参数默认为1000ms