又到了一年一度的大抢购,李佳琦熬夜赚钱白天补觉,我熬夜花钱白天还得打工,我们都有光明的未来,加油,尾款人。
作为一个打工魂强过尾款魂的人,今天想用比尾款活动规则更简单更常见的方式来讲讲大流量的抢购系统怎么设计,毕竟拧螺丝使我快乐。
我们以地铁高峰期来比喻抢购系统,看看彼此之间的相似点。
= 整体场景相似性 =
抢购 | 地铁高峰 | |
---|---|---|
流量冲击 | 用户短时间大量访问,下订单,付款。 | 乘客集中涌入地铁站,过闸机、排队、上车。 |
相似场景 | 下订单 | 过安检 |
负载均衡 | 多口分流 | |
流量不能引起核心业务崩溃 | 排队限流,车门关门 | |
商品不能超卖 | 座位上满了不能再坐 | |
临时扩大带宽与处理能力 | 增加车辆提升运能 |
人类也许并没有为了计算机系统的架构设计发明什么新思想,只是把那些人们已经反复使用的思想用另一种方式在另一个场景做了实现而已。系统实现的基础是什么?是业务场景。业务场景的基础是什么?是生活场景。那些解决复杂场景的智慧或许早已蕴藏在了我们的日常生活中。
下面我们来一个一个的看,地铁高峰的场景与抢购系统有多相似。
= 过安检与下订单 =
在抢购中,货物在有限时间内是有限的,如果让大量无效订单进入系统,会对系统整体造成极大,甚至是破坏性的冲击。
地铁高峰也是如此,大量的人流涌向地铁,我们不能让这些人都一股脑涌入进去,有些人可能没有车票,而更多的人即使涌入了站内和站台,也无法上车,最终还可能导致意外事故的发生。
所以地铁在最外层设立安检,让无序蜂拥而入的流量在这里分流到不同入口,并且通过排队与安检,筑起了一个泄洪大坝。而且还能发现危险分子,将其挡在地铁之外。
= 多口分流与负载均衡 =
当用户的订单经过初步校验,进入系统后,系统都是经过大量负载均衡优化的分布式系统,以此将流量分散到不同的服务器上进行处理,提升系统吞吐量以及性能,很多的系统甚至会有多次负载均衡,来将用户与数据做更好地负载分布。
地铁我们过了安检进站后,会看到不同的楼梯口,这时你看到某楼梯口人比较多的时候,你就会选择走人少一些的楼梯口,这样就实现了第一次的负载均衡。
从楼梯下去,是很多的排队队伍,于是我们又会开始走动寻找人少的队伍开始做排队,这里的队伍就更多了。如果大家都只挤在少数几个队伍,而其他队伍是空的,那么我们的排队策略就肯定有问题了。
= 限流与核心业务保障 =
任何的场景都有核心必须保障的部分,外围的可能都是护城河,而电商抢购场景是最终商品被用户恰好买走,不多不少,不能因为外面没抢到的用户一哭二闹三上吊就乱了方寸,这是有着钢铁意志的电商技术产品运营打工人该有的铁石心肠,毕竟用户付了款没拿到货或者货到了钱没付会更糟。
地铁会在高峰期有很多排队引导的栅栏,将大量涌入的人潮挡在核心价值外面。有时候5:30下班,地铁外围排队能排近半小时,可是突破了这层排队,里面并不会特别拥挤,这就是用外围的非核心功能保护核心价值的稳定输出。
= 满座与超卖 =
你们还是尾款人,知足吧,我是一个手速慢到定金都没付成就直接商品已售尽的人。系统可以用乐观锁、缓存等机制来控制商品数量。但是也可能出现缓存击穿等场景。
其实每次上了地铁我还是想要座位的,但是作为一个小伙子,似乎不站着又显示不出自己的帅气,主要还是没座位。座位数是固定的,坐满了就不能再坐了,你要再硬挤一个那可就难受了,所以坐满后如果还有人想挤来坐,那就不好意思了,大家都把座位锁定了,没有特别情况不会再让另一个人挤进来。而如果有人从座位上起来了,那么一般是距离该座位最近的这个人会坐到这个座位上,除非有人具有特殊优先级,比如老人与孕妇。
= 临时提升运能与加服务器及带宽 =
抢购时,流量的短时涌入会比往常大非常多,任何一家企业不会常备这么多的服务器资源或者网络带宽,所以这就需要与运营商沟通短期租赁带宽,而在系统负载方面就是大家已经熟悉的云服务,通过容器及K8s等技术实现快速弹性扩容。
在上班的早高峰,基本1分钟左右就会有一辆车来,但是在平常时间,这个等待时间可能是3、5分钟,甚至更久。这就是为了应对短期高峰,调配更多的资源,保障地铁的运营,提升吞吐量并适当保障服务质量。
= 写在最后 =
我们将几大场景分别作了类比,是不是地铁高峰与抢购其实很像,只要你去观察生活,生活教会你的智慧运用到系统设计中,系统设计也就没那么难了,毕竟人生最难的还是生活。
最后那些说双11没什么东西要买,最后却在疯狂收快递的小伙伴,嗯?