来自我的博客 秒杀活动的设计
html 等静态文件上CDN ,这方面压力不大
后台程序动态接口,必须支持高并发,用户体验必须作好
后端程序优化点(欢迎你们补充)php
// 后台进程消费队列 我的使用brpoplpush方法 取出数据并用存入另外队列做数据备份 $block_expire_time = 0; # 设置阻塞等待时间为永久 $redis->brpoplpush($key, $backup_key, $block_expire_time);
$lock_status = $redis->set($lock_key, 1, array("NX", "EX"=>$expire_time));
我的设计的方案:提早把每一个奖品放入 redis队列,每一个key一个奖品,队列的长度是奖品的数量,能够保证奖品不会超发放
另外,假设使用
悲观锁,在更新数据的时候加锁,其它的都为等待状态,不合适秒杀场景
乐观锁 基本是采用带版本号更新,版本号匹配才能更新,其它的回滚,虽然保证的数据的安全不超发放,可是在高并发场景下,DB只有两台的时候,超过mysql 进程堆积确定会的, 超过最大链接数是怎么办,一系列的问题须要解决,因此该方案不合适html
在平均响应时间300ms内,单台qps 750 左右(保持300ms是公司压测试的规范指标)
10台机器(后面新增2台到 8+2)一秒钟能处理: 10 * 750 = 7500
保守的并发只有7500,与10w 差距大,须要在执行方案上解决,公司不可无限的申请web机器。
解决10W并发问题(资源有限的状况)方案
在代理层作处理,根据权重挡掉93%的量,返回800(自定义),前端判断是否为800,是则提示火爆用户重试(对应的方案设置友好一些)前端