秒杀系统并发应对的设计思路小结
来源:互联网 发布:java堆栈溢出怎么解决 编辑:程序博客网 时间:2024/06/05 10:34
秒杀系统跟抽奖不同,抽奖是随机中奖,秒杀需要在启动时的瞬间,
把所有物料,顺序分配给进入系统的用户,直到分配完毕为止,
用户量大的时候,对系统的冲击也是非常大的,经常出现系统失去响应,崩溃等,
甚至于系统挂了,用户却中不到奖品(奖品超发是程序bug,本文暂不讨论)。
说明:
- 本文主要针对移动h5网站 或 pc端web网站,对手机app而言,其实思路类似
- 文中所有限制数据,需要根据业务实际情况配置,比如10秒,每秒3次之类
设计思路:
1、针对99%的正常用户,在前端进行限制,大致需要实现如下2个逻辑:
1.1、用户点击按钮后,按钮置灰,不再触发点击事件,直到响应返回才启用,
避免用户拼命点击鼠标,代码参考:
<button onclick="doKill(this);">秒杀</button>function doKill(obj){ $(obj).attr('disabled', 'disabled'); if(window.sending){ return; } window.sending = true; $.ajax({ type: 'GET', url: 'https://app.baidu.com/api?secondKill', cache: true, dataType: 'json', success: function (response) { $(obj).removeAttr('disabled'); window.sending = false; if (response.code !== 200) { alert('error' + response.msg); return; } alert(response.result); } });}
1.2、cookie限制每用户第二次点击必须10秒以后,才能再次发送请求到后端,所以用户看似在拼命点击,实际上10秒内只发一次有效请求,示例代码:
var cookiename = 'last_kill_time';var lastSendTime = getCookie(cookiename);var currentTime = Date.parse(new Date());var diff = currentTime - lastSendTime;if(diff < 10000){ return;}// 发送请求到服务器的代码,然后再设置cookiesetCookie(cookiename, currentTime);
2、第1步限制了绝大多数的正常用户冲击,但是无法应对有经验的程序员,so,要服务端在IP和用户层面进行限制:
2.1、每IP,每秒只允许3次提交,超过3次,直接返回失败;
2.2、每个用户ID,每秒只允许3次提交,超过3次,直接返回失败;
注1:这2个步骤,可以在内存计数进行限制,也可以通过redis计数限制(存在多服务器分布式部署时)。
注2:需要考虑公司IP,一个IP多用户共用情况,另外无法限制有多ip代理和手上储存了很多用户账号的恶意用户,而且会出现同一时间,对不同用户响应不一致的情况,比如剩余奖品数有差异等等。
3、请求队列,单线程处理所有用户请求
比如有100个奖品,却有1万个正常用户来抢,把全部用户请求透传到DB显然有问题。
通常做法:
3.1、每放过一个请求,redis加1 ,超过总奖品数,直接返回失败;
这一步,要有失败补偿失败,比如有些用户抢到不要了,要给redis计数重置。
3.2、使用消息队列,正常请求全部加入队列,队列达到一定长度,就停止入队,返回失败,队列处理完毕,又允许入队,如此反复。
基本上就是如上3步了,在运维层面也可以做不少事情,比如多服务器负载均衡、前端网关层防冲击等等。
- 秒杀系统并发应对的设计思路小结
- 关于高并发支付、秒杀的一些设计思路
- 高并发系统的设计及秒杀实践
- 秒杀设计的小结
- 电商 秒杀系统 设计思路和实现方法
- 秒杀系统的设计
- 高并发秒杀系统的优化
- 秒杀系统优化思路
- 秒杀系统优化思路
- 秒杀系统设计,高并发下的下单功能设计
- 高并发秒杀系统
- 秒杀系统设计
- 秒杀系统设计
- 通过系统的设计、架构优化打造出PHP秒杀系统-高并发高性能的极致挑战-秒杀海量数据访问
- 秒杀系统的设计猜想
- 秒杀系统设计的知识点
- 秒杀系统设计的知识点
- 秒杀系统的架构设计
- PAT (Basic Level) Practise (中文)1072. 开学寄语(20)
- 【Node】Node安装
- hdu 5950 数学公式 + 矩阵快速幂
- php验证码的封装和使用
- [DeeplearningAI笔记]神经网络与深度学习3.2_3.11(激活函数)浅层神经网络
- 秒杀系统并发应对的设计思路小结
- 编写程序数一下 1到 100 的所有整数中出现多少次数字9。
- python爬虫实战笔记---selenium爬取QQ空间说说并存至本地(上)
- java---策略模式
- 跟我撩fastjson-第一章:认识fastjson
- 实验4:栈和队列的基本操作实现及其应用之《顺序栈》
- [bzoj2427][HAOI2010]软件安装(树形dp+tarjan)
- nodejs中流(stream)的理解
- linux 下时间字符串和time_t类型之间的相互转化