来自个人博客 秒杀活动的设计业务的基本说明
运营评估最高的并发会达到 10W(根据推广的力度,以及以往的经验)
业务现有的服务器架构 反向代理 4台,前端机 8台, db 2台(主从),redis 2台(主从)以下是服务器架构图
动静分离html 等静态文件上CDN ,这方面压力不大
后台程序动态接口,必须支持高并发,用户体验必须做好
后端程序优化点(欢迎大家补充)
程序尽可能的减少加载的文件
程序减少不必要的网络请求
redis 队列来作 异步方式实现
// 后台进程消费队列 个人使用brpoplpush方法 取出数据并用存入另外队列作数据备份 $block_expire_time = 0; # 设置阻塞等待时间为永久 $redis->brpoplpush($key, $backup_key, $block_expire_time);
redis 缓存
前端点击按钮请求后变灰,防止用户重复点击
静态文件上CDN
nginx的最大连接数设置为550,防止连接数过大时全部到php,导致php服务挂了
针对每个用户加并发锁(redis),防止高并发情况判断条件被绕过,程序执行完后解锁。
$lock_status = $redis->set($lock_key, 1, array("NX", "EX"=>$expire_time));高并发下奖品超发问题
个人设计的方案:提前把每个奖品放入 redis队列,每个key一个奖品,队列的长度是奖品的数量,可以保证奖品不会超发放
另外,假设使用
悲观锁,在更新数据的时候加锁,其它的都为等待状态,不合适秒杀场景
乐观锁 基本是采用带版本号更新,版本号匹配才能更新,其它的回滚,虽然保证的数据的安全不超发放,但是在高并发场景下,DB只有两台的时候,超过mysql 进程堆积肯定会的, 超过最大连接数是怎么办,一系列的问题需要解决,所以该方案不合适
在平均响应时间300ms内,单台qps 750 左右(保持300ms是公司压测试的规范指标)
10台机器(后面新增2台到 8+2)一秒钟能处理: 10 * 750 = 7500
保守的并发只有7500,与10w 差距大,需要在执行方案上解决,公司不可无限的申请web机器。
解决10W并发问题(资源有限的情况)方案
在代理层做处理,根据权重挡掉93%的量,返回800(自定义),前端判断是否为800,是则提示火爆用户重试(对应的方案设置友好一些)
接口程序不连接查询mysql数据库
奖品的数据存放redis队列,每个奖品一个key,队列长度是奖品的数量
用户成功领取红包(或抢购)时的代码流程(不包括业务限制与防刷),从队列获取奖品成功,再入队列(此队列后台消费入库),返回给用户领取成功。在用户体验上有所提升,但如果后台队列堆积太多,未能消费完成,用户查看的红包时是没有对应记录的,所以针对自己的需求作对应的优化。
活动流程图(开爷画的)文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39474.html
摘要:即使秒杀系统崩溃了,也不会对网站造成影响。动态生成随机下单页面的为了避免用户直接访问下单需要将动态化,用随机数作为参数,只能秒杀开始的时候才生成。架构设计如何控制秒杀商品页面抢购按钮的可用禁用。该文件不被缓存的做法随机数。 秒杀背景 电商中为了吸引顾客、聚集人气,经常会策划一些秒杀活动。活动中售卖的商品,要么价格远低于市场价格,要么比较稀缺(如一些新发布的商品)。这些商品电商一般都会限...
摘要:即使秒杀系统崩溃了,也不会对网站造成影响。动态生成随机下单页面的为了避免用户直接访问下单需要将动态化,用随机数作为参数,只能秒杀开始的时候才生成。架构设计如何控制秒杀商品页面抢购按钮的可用禁用。该文件不被缓存的做法随机数。 秒杀背景 电商中为了吸引顾客、聚集人气,经常会策划一些秒杀活动。活动中售卖的商品,要么价格远低于市场价格,要么比较稀缺(如一些新发布的商品)。这些商品电商一般都会限...
摘要:即使秒杀系统崩溃了,也不会对网站造成影响。动态生成随机下单页面的为了避免用户直接访问下单需要将动态化,用随机数作为参数,只能秒杀开始的时候才生成。架构设计如何控制秒杀商品页面抢购按钮的可用禁用。该文件不被缓存的做法随机数。 秒杀背景 电商中为了吸引顾客、聚集人气,经常会策划一些秒杀活动。活动中售卖的商品,要么价格远低于市场价格,要么比较稀缺(如一些新发布的商品)。这些商品电商一般都会限...
摘要:动态生成随机下单页面的为了避免用户直接访问下单需要将动态化,用随机数作为参数,只能秒杀开始的时候才生成。该文件不被缓存的做法随机数。浅谈秒杀系统架构设计如何只允许,第一个提交的单进入订单系统。未超过秒杀商品总数,提交到子订单系统。 秒杀是电子商务网站常见的一种营销手段。 原则 不要整个系统宕机。 即使系统故障,也不要将错误数据展示出来。 尽量保持公平公正。 实现效果 秒杀开始前,...
摘要:但很显然这些请求的处理性能并不好,有没有更好的解决方案这时可以想到布隆过滤器。系统根据商品,先从布隆过滤器中查询该是否存在,如果存在则允许从缓存中查询数据,如果不存在,则直接返回失败。所以布隆过滤器绝大部分使用在缓存数据更新很少的场景中。高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。 秒杀一般出现在商...
阅读 2206·2021-09-24 10:31
阅读 3808·2021-09-22 15:16
阅读 3359·2021-09-22 10:02
阅读 984·2021-09-22 10:02
阅读 1782·2021-09-08 09:36
阅读 1955·2019-08-30 14:18
阅读 590·2019-08-30 10:51
阅读 1847·2019-08-29 11:08