高并发秒杀App设计思路和注意事项
一、明确问题:
设计一款具有高并发的负载能力、稳定性、准确性、可运营性的APP。
二、系统目标:
1.并发能力要尽量的高,能承受瞬时的峰值,系统必须顺畅运行;
2.面对海量用户的并发抢购,不能超卖(可容忍小量的超卖);
3.只有预约用户可以购买,一个用户只能买一台;
4.抢购结果必须非常可靠,购买记录不可丢失;
5.用户体验尽可能好。
三、设计思路(硬件+部署+软件+业务):
(一)硬件(在有条件的情况下):
1.处理能力的提升:部署多颗CPU,选择多核心、具备更高运算频率、更大高速缓存的CPU;处理能力的提升最直接的反应在于Web请求的处理效率和PHP程序的执行效率。
2.内存容量:更大的内存容量;内存容量的提升最直接的反应在于应对数据库大量
的数据交换。
3.磁盘搜索与I/O能力:选择更高的转速、更大的硬盘缓存、组件磁盘阵列(RAID);
磁盘搜索与I/O能力的提升最直接反应在于数据库大量的查询和读写以及文件的读写。
4.网络带宽的提升可考虑的因素包括:更大带宽、多线路接入、独享带宽;
(二)部署:
1.服务器分离
将web服务器和数据库服务器分离:增加安全性、提高处理效率;
2.数据库集群和库表散列
很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案和在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列
3.基于请求的负载均衡
在客户端发起登陆的时候,集群网关会同时登录到集群各节点数据库,此后所有的客户端请求,经过集群网关的分析被分成两类,查询请求根据负载均衡算法挑选一个节点执行,数据更新请求则有主机执行并实时同步数据到集群各节点)
(三)软件:
1.在秒杀系统中进行限制流量操作,尽量将并发量拦截在系统上游。
比如通过用户预约验证和每秒向后端放行流量控制等措施(客户端验证、JS层面提交请求的限制、站点层面对用户的访问拦截等措施减少最终放行的并发流量);
2.对于写请求,数量较少,使用请求队列,每次只放有限的写请求去数据层。
如果均成功再放下一批,如果库存不够则队列里的写请求全部返回“已售完”。
3.对于读请求,可以使用数据缓存来抗压力,比如memcached或者redis等(Redis 是一个高性能的key-value数据库,支持主从数据库同步)。
memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
4.浏览器拦截了大量流量,站点层拦截了几乎拦截了绝大多数流量并做了页面缓存,服务层又做了写请求队列与数据缓存,每次透到数据库层的请求都是可控的,所以数据库层的压力也是足够承受的。
(四)业务:
1.将商城系统和秒杀系统分离,从而减小商城系统压力,在秒杀系统中成功秒杀后,再讲数据导入到商城系统中。
附1-1:HTTP服务层(站点层)主要功能如下:
1.进行基本的URL正确性校验;
2.对恶意访问的用户进行过滤,拦截黄牛;
3.提供用户验证码;
4.将正常访问用户数据放入相应商品队列中;
5.等待业务处理层返回的处理结果。
附1-2:业务处理层(服务层)主要功能如下:
1.接收商品队列中的数据;
2.对用户请求进行处理;
3.将请求结果放入相应的返回队列中。
附2-1:注意事项:
1.数据一致性:在分布式系统设计中,有一个CAP原理(“一致性、可用性、分区容忍性”三个要素最多只能同时实现两点,不可能三者兼顾)。
针对秒杀活动,要面对极端的爆发流量负载,分区容忍性和可用性会非常重要,因此决定牺牲数据的强一致性要求。