秒杀系统的常识

3月 14, 2019 |

1、update t_seckill_goods set stock=stock-1 where stock>0 and id=1 对同一条记录update,秒杀扣减库存的场景,那么所有的请求需要在数据库排队,且每个请求都需要持久化,最慢的操作,基本上100/s,所以如果有100个库存,将库存拆成10条记录,按用户的id取模去扣减相应的库存量,也能提交并发量
2、insert into t_order 由于插入不是针对同一条记录,只要日志记录成功就满足了数据库的持久化要求,基本上1000/s
3、update t_seckill_goods set stock=stock-1 where stock>0 and id=1 当不满足stock>0时 update退化成select 语句,基本上3000-5000/s
4、tomcat 空跑(收到请求后返回hello world信息),基本上5000-2w/s
5、一个事务中 扣减库存+ 插入订单记录 基本上100/s
6、服务层添加计数器,如果秒杀的商品数量很少, 那么数据库基本上没有流量


private volatile  boolean start = false;
private AtomicInteger counter = new AtomicInteger(100);

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
	if(start && counter.get() > 0) {
		counter.getAndDecrement();
		dbService.secKill(1);
	}
	resp.getOutputStream().write("ok".getBytes(StandardCharsets.UTF_8));
}

7、资源规划:每个请求基本上耗费1k以上的带宽,现在的云服务器基本上都有带宽和PPS(每秒收发的包)双重限制。每个Http 请求至少需要10个数据包(SYN,SYN/ACK, ACK ,DATA, DATA/ACK, ACK, FIN, FIN/ACK, ACK),所以100万QPS的网站需要最少带宽(1GBps~10Gbps, 1000万PPS),如果顶级路由采用代理, 那么PPS会翻倍,如果TCP发生了拥塞控制,那么PPS的数据还会增加。目前来看,使用LVS的DR模式是个选择,

所以设计秒杀系统时,一定要层层过滤,让数据库的不要成为瓶颈,

 

Posted in: WEB开发

Comments are closed.