糖果空投系统优化
前言
处理高并发,前人已经有了很多技术储备和实战经验,需要结合不同的系统,做不同的侧重点。就像在分布式系统设计中,有一个CAP原理。“一致性、可用性、分区容忍性”三个要素最多只能同时实现两点,不可能三者兼顾。
乐观锁介绍:乐观锁是一种并发控制的方法。它的对立面是悲观锁,可以自行了解。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。
Redis watch的使用:Redis 通过 MULTI
、 DISCARD
、 EXEC
和 WATCH
四个命令来实现事务功能。
前端优化
添加函数节流,添加函数防抖,添加geetest校验。
// 简单的节流函数
function throttle(method, context) {
clearTimeout(methor.tId);
method.tId = setTimeout(function(){
method.call(context);
}, 100);
}
// 简单的防抖函数
function debounce(fn,wait){
var timer = null;
return function(){
clearTimeout(timer)
timer = setTimeout(()=>{
fn()
},wait)
}
}
后端优化
逻辑:参数校验,糖果项目校验(是否过期,是否发完等…),开始事务,验证体力,体力减少,验证糖果总量,插入领取成功数据,事务提交。
4月9号,糖果盒子空投MBL,由于之前空投TOP,市场已经预热,那时候用户就已经有上万,但是这一次的抢购的用户数量是之前的好几倍,糖果抢购还是用的之前的系统架构,只是加了几台nodejs服务器,当晚7点抢购开始,用户涌入,导致数据库压力过大,死锁。系统不响应,页面卡死,数据出不来,用户体验非常差。
加了nodejs服务器,但是没考虑到数据库的压力。数据库性能需要考虑的方面比较多,cpu,内存,磁盘,网络 都是其运行指标。
这种做法数据库压力过大,后续优化:redis去缓解数据压力。
优化:redis去缓解数据压力。因为我们这个抢购系统复杂度并不高,可能很长一段时间也只抢购这一种币,所以需要尽可能提高一致性和可用性。所以做法来说也并不复杂。
具体做法:人工将添加库存添加redis请求队列(list),用户抢购不直接操作数据库,而且去消耗redis里面的库存队列,再将用户插入排队hashtable里,以及在订单list插入一条数据,这些都是在redis里面完成的,如果redis库存消耗完,就直接返回错误信息给前端。然后我们这边再异步处理排队中的用户,同步到数据库。这样就能大大减轻数据库的压力。
参考
附录
candybox抢购页面
😋这篇文章已经发到仙女座科技最新产品智能签名上了,欢迎赞赏😋
《糖果空投系统优化》by shellteo2345
https://smartsignature.io/article/330?invite=shellteo2345
赞赏好文,分享有收益 !