读了极客时间许令波的如何设计秒杀系统后,总结出秒杀系统设计的一些需要注意的点,如何从更多的角度去考量一个架构的设计,保证性能和高可用。
这些经验或者说原则不仅仅适用于秒杀系统,在设计其他系统的时候也有一定的参考性。
总结起来就是:4要,1不要
这里的数据值得是用户和系统间传输的数据,包括用户上传给系统的数据和系统返回给用户的数据。
数据少涉及几个方面:
当用户请求页面后,还会有一些其他的额外请求,如静态资源css/js等,每一个请求都会做三次握手,如果资源不在同一个域名下,还会对dns解析形成负担。
可以将多个资源合成一个文件,尽可能对减少请求数
路径指的是,用户发出一个请求到返回数据的过程中,经过的中间节点数。
每新增一个节点不但会新增一次网络连接,并且会新增不确定性(多一个节点,就会增加多一个风险点)。缩短请求路径可以增加可用性,也能提升性能。做法一般是将多个互相依赖多应用合并部署在一起,将RPC调用变为本地JVM调用
依赖指的是完成一次用户请求必须依赖的系统或者服务。分为强依赖(必须的依赖)和弱依赖(必要时可以去掉)
如秒杀页面必须依赖商品信息、用户信息,但是其他如优惠券、成交列表等并不是非要不可的信息,这些弱依赖就可以在紧急的时候去掉。
做法一般是将系统按重要程度进行分级,0级系统要尽量减少对1级系统的依赖,防止重要系统被不重要系统拖垮,在极端情况下可以把不重要系统降级,防止拖垮重要系统。
在系统设计中,保证高可用,我们会将每个应用部署多份,作为备份,这也是分布式系统最重要的一点。
避免单点的关键是不要将服务的状态与机器绑定,即将服务无状态化,这样服务就可以在机器中随意移动。将服务与机器状态解耦的方式:与机器相关的配置动态化,服务启动的时候从配置中心拉取,在配置中心设置一些规则来改变这些映射关系。
为了提升系统的速度,需要从两个方面去考虑:
动静分离就是针对这个大方向去考量的,尽量只刷新局部数据,分离动态数据和静态数据,每次只请求动态数据,将静态数据缓存起来,客户端大幅度减少了请求的数据量。
分离出动态数据,以商品详情页为例子:
通过上述的原则可以分离出动态数据,这样静态数据可以通过缓存来处理,动态数据的处理通常有两种方案:
热点分为热点操作和热点数据:
静态热点数据可以通过筛选,将可能热卖的商品提前进行预热处理,缓存等
动态热点数据,可以通过大数据进行预测分析发现
处理热点数据的思路:
对于秒杀系统的流量来说,请求高度集中于某一特定时间点,这样某一个瞬间就会有一个特别高的峰值,它对资源对消耗是瞬时的。但对于秒杀这个场景来说,能抢到商品的人数是固定的,并发度越高,无效的请求越多。我们可以在真正下单的时候,设计一些规则,让并发的请求更多的延缓,甚至可以过滤到一些无效的请求。
服务器处理资源是恒定的,我们不能以峰值的要求来配置服务器,这样会让空闲的资源浪费。使用削峰的方式,错峰限行,可以让服务端处理变得更加平稳,也可以节省服务器成本。针对秒杀场景,本质上削峰是为了延缓用户请求的发出,以便减少和过滤掉一些无效请求,遵循了”请求数尽量少”的原则。
削峰一些常见的操作思路:排队、答题、分层过滤。还有一些强制措施,比如限流和机器负载保护等。
对于瞬时流量,最容易想到的是通过消息队列来缓冲,把同步的直接调用转换成异步的间接推送,中间通过一个消息队列来承接瞬时的流量洪峰,在另一端将消息平滑的处理消息。
除了消息队列,类似的排队操作还有:
答题是一种限制手段,为了过滤掉一些机器请求,排队是对发出对请求进行缓冲。分层过滤的思路是用一种漏斗式的设计,来分层过滤掉一些无效请求:
就像漏洞一样,数据一层一层减少,最后到末端的数据就很少了。
分层过滤的核心思想是在不同层次尽可能的过滤掉无效请求,让达到漏洞末端的才是有效请求,这需要对数据进行分层校验
分层过滤非常适合交易性的写请求,比如减库存或者拼车这种场景,在读的时候需要知道还有没有库存或者是否还有剩余空座位。但是由于库存和座位又是不停变化的,所以读的数据是否一定要非常准确呢?其实不一定,你可以放一些请求过去,然后在真正减的时候再做强一致性保证,这样既过滤一些请求又解决了强一致性读的瓶颈。
在秒杀系统中,超卖是一个原则性问题,假如只秒杀10个商品,确有100个人抢到了,这是一个大损失。
用户购物过程一般分为两步:下单和付款。在哪个环节减库存,是一个考量,一般分为几种方式:
如果使用下单减库存,很多人恶意下单后并不付款,这样可能导致恶意下单,从而影响卖家销售。
如果使用付款减库存,又可能导致超卖,因为下单成功的人数很可能超过真正的库存数,这样很多买家下单成功确无法付款,购物体验极差。
针对上述情况,将下单减库存和付款减库存两者结合起来,下单时先预扣,在规定时间内不付款在释放库存,即采用预扣库存的方式会一定程度上缓解上面的问题。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有