大家好,我是树哥。秒杀系统的设计是高级求职面试中出现频率很高的话题,能够更好地考察应聘者的知识体系。对我们来说,学习秒杀系统的设计可以让我们学以致用,在设计系统的时候考虑的更全面。今天就让树哥带你看看如何设计秒杀系统吧!活动一般出现在电子商务公司的促销活动中。一般指定少量商品,以极低的价格让大量用户参与,导致活动在极短的时间内大量用户参与,进而导致系统失败。极短时间内的极高流量。系统设计的目的是让系统能够稳定的支持活动,所以它的稳定性和高可用性是我们首先考虑的。要想知道如何优化秒杀系统,我们需要对请求的整个过程有一个全局的了解。一般来说,秒杀活动请求以公网为分界点,可以分为:前端部分和后端部分。前端部分是指从用户端到后端服务的部分,包括移动端的处理、DNS解析、公网的数据传输等。后端部分是指通过公网进入后端的服务器网络,包括前端负载均衡器(Nginx等)、应用服务器、数据库层等。秒杀活动的整个过程可以用下图表示数字。The-process-of-network-request我们要设计一个秒杀系统,自然会从这两部分优化。总体思路是尽量把流量堵在前端,让尽可能少的流量去后端部分。因为我们越往后端走,我们的处理逻辑就越重,它的处理能力就越弱。前端优化对于前端部分,常见的优化方式有:页面静态+CDN、请求频率限制。页面静态+CDN一般来说,活跃页面是流量最大的地方。活动页面的大部分内容都是固定的,比如产品描述、图片等,这时候不需要每次都去请求服务器,而是把这些静态内容放在CDN上。每次打开页面,直接请求CDN服务器,可以大大减少后端的请求流量。加入CDN后,请求流程如下:CDN对静态数据进行优化所谓CDN就是一个内容分发网络,它由许多分布在世界各地的缓存服务器组成。用户每次请求特定的域名,都会转发给对应CDN的DNS解析服务器,然后返回一个离用户地理位置最近的CDN服务器。然后,用户直接请求这台CDN服务器获取数据,大大减少了远程网络传输的时间,也减轻了后端服务器的压力。所以对于秒杀活动的设计,我们可以将所有可以静态化的内容静态化,然后配置到CDN服务器上。这样不仅提高了用户打开页面的时间,也减轻了后台服务器的压力。请求频率限制请求频率限制是指根据业务的特点,在前端做一些流量拦截,以减轻后端服务器的压力。常见的拦截方式有:设置一个请求概率,只允许30%的概率向后端发送接口请求。设置一个请求频率,比如10秒内只能请求一次,之后按钮会变灰。通过这种方式,我们可以减少很大一部分流量。但在实际实现中,可能需要考虑安全问题,防止部分用户直接调用后台接口,绕过前端频率检查。一种常见的方法是在频率校验的时候生成一个参数,然后在请求后端服务的时候携带这个参数。没有这个参数的请求被认为是非法请求,直接被拒绝。后端优化无论我们付出多少努力,总会有大量的流量来到后端服务器。后端优化一般有几种方式:增加缓存层+预热数据MQ异步处理限流,熔断,自下而上的业务端优化增加缓存层+预热数据如果我们从读取所有数据数据库,数据库可能无法承受大流量。这时候常见的优化就是增加缓存层。在我们需要查询数据库之前,先查询缓存,这样可以减少大部分的数据库请求,减轻数据库的压力。如果在缓存中没有找到数据,我们就去数据库中,然后在缓存中缓存数据。在引入缓存层的时候,我们需要考虑缓存击穿和缓存穿透的可能性,这些优化在编写相关代码的时候一定要做好。另外,我们可以在闪购开始前手动将热点数据加载到缓存中,避免在闪购期间请求数据库。MQ异步处理我们知道,秒杀活动一般会涉及抢购、下单、支付、发货等阶段,而抢购及后续阶段可以异步执行。为了避免对下单、支付、发货等阶段造成影响,我们可以通过MQ将抢购阶段与后续阶段进行解耦。当用户抢购成功后,会向消息队列中抛出一条消息,然后订单系统会消费它来下单。通过系统间的解耦处理,我们可以将原来的同步处理方式变为异步处理,从而大大减少请求的处理时间,提高系统的并发处理能力。其次,也可以避免系统之间的相互影响,提高了整个系统的稳定性。限流、熔断、降级虽然我们做了很多优化措施,但是还是有可能出现请求过多的情况,那怎么办呢?我们可以在各个业务系统中进行限流操作,避免因为请求过多导致整个系统出现故障。当并发请求在正常范围内时,我们正常处理请求。当超过设置的限流阈值时,我们直接拒绝请求并提示用户购买失败。如果没有限流操作,系统会直接崩溃,无法处理任何请求。并且通过限流,系统至少可以保持正常工作,不会出现无法处理单个请求的情况。但需求过剩无法在第一时间处理,提示失败也在情理之中。除了限流之外,不同的系统还可以采用断路器和降级服务治理措施。熔断是指当请求错误次数超过阈值后,不再使用后端服务,直接返回失败。同时每隔一定时间放几个请求重试后端服务看是否正常。没问题就关闭断路器,失效就继续快速失效。断路器的目的是防止上游因为下游的短暂异常而不断重试,最终导致下游请求过多,最终压垮下游系统。降级是指在服务失败或异常时,返回指定的默认信息。降级的目的是保证有基本信息。当下游异常时,与其返回空信息,不如返回一个默认的有业务意义的信息,这样可以提升用户体验。业务端优化总的来说,经过上述的整体优化,系统已经能够比较稳定的应对秒杀活动。如果此时流量还比较大,那么或许应该从业务端进行优化。比如12306开始,购买时间是同时的,导致同时并发量太大,系统经常支持不了。后来,12306延长了购票周期,允许提前20天购买火车票。通过业务端的优化,我们将1小时的抢购时间分配到了20天,服务器压力降低了480倍!张小龙还说:如果公司里最厉害的程序员觉得业务实现起来很复杂,很可能是业务真的不合理,这时候就应该从业务端去优化。比如一个存储了10亿条记录的消息记录表,业务方想在一年的数据范围内快速查询,这是无论如何也做不到的。这时候就需要从业务需求端进行优化,否则不可能两全其美。对于这种场景,一个合理的实现方式是:要实现1年数据范围的查询,只能根据消息ID进行查询,因为这样可以使用上层索引。但是如果要按照时间范围查询,只能将查询时间缩短到3天以内,这样也能满足业务需求。所以从业务端优化是一个四通八达的办法,可以大大降低技术端的实现难度。总结一个秒杀系统的设计,可以从前端和后端整体优化。对于前端优化,可以从“页面静态+CDN”和请求频率限制两个方面进行优化。其中,“页面静态+CDN”是指固定不变的静态数据,然后放入CDN服务器,从而降低用户请求的响应速度,降低服务器的并发压力。请求频率限制是通过抢购概率和抢购频率限制来降低后台服务器的服务压力。后端优化一般有四种优化方式:“增加缓存层+预热数据”、“MQ异步处理”、“限流、熔断、降级”、业务端优化。其中,“增加缓存层+预热数据”是指将热点数据存储在缓存中,并在Activity启动前提前加载到缓存中,减轻数据库层的读取压力。“MQ异步处理”是指通过MQ对非本质业务逻辑进行异步处理,减少请求处理延迟,提高业务系统的整体稳定性。“限流、熔断、降级”是对微服务整体的保护。其中,限流是指限制请求。当超过限流阈值时,直接拒绝请求,保护系统自身;熔断是指对下游系统的保护。当请求的下游系统连续错误超过阈值时,不会自动请求下游系统,避免下游系统被过多的重试流量压垮。降级是指在请求失败时自动返回默认数据,提升用户体验。业务端优化是指在业务层面进行逻辑优化,从而降低技术复杂度,使业务和技术复杂度达到平衡状态,有利于更好地实现秒杀系统的高可用和高并发。上面提到的6种优化思路是设计秒杀系统的常用优化思路。但在实际业务场景中,除了保证正常的功能设计外,还要考虑防欺骗、安全、黑产等问题。这个时候可能需要考虑一些其他的优化。用户不能抢货等。这时候你可能需要考虑添加验证码、使用app设备指纹等风控措施。另外,对于秒杀系统来说,做好业务指标和系统指标的监控也很重要。文章思维导图参考资料VIP!极客时间!系统学习!如何设计秒杀系统Designofaseckillsystem-HowtodoaseckillsystemforNuggets?折磨死人……架构的高并发:降级与熔断|Java全栈知识体系小米抢解密限流巅峰系统“大秒”架构-一天没有进步就是倒退-博客园
