2024年前端最全如何设计一个合格的高并发秒杀系统_java高并发系统设计,【面试宝典】

紧跟潮流

大前端和全栈是以后前端的一个趋势,懂后端的前端,懂各端的前端更加具有竞争力,以后可以往这个方向靠拢。

这边整理了一个对标“阿里 50W”年薪企业高级前端工程师成长路线,由于图片太大仅展示一小部分

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

4.2 接口分离

接口分离包含两个方面:一个是秒杀接口与其他接口分离,一个是高频访问接口与低频访问接口分离。

对于秒杀系统的接口来说,在设计上一定要与其他的接口进行分离,不要让秒杀系统的接口与其他业务的接口互相关联引用,避免秒杀系统的瞬时高并发流量对其他接口造成影响。

就秒杀系统而言,并不是每个接口的访问频次都一样,一本情况下,商品详情页、结算页和秒杀下单接口的访问频次要远远大于支付接口的访问频次。在设计上一定要将这些接口进行区分隔离,对高频访问的接口进行单独的性能优化。

4.3 数据分离

数据分离也会包含两个方面:一个是秒杀数据与其他数据分离,一个是动态数据与静态数据分离。

一般情况下,秒杀数据瞬时的增长率会远远大于其他数据,在数据上进行分离,可以对秒杀数据的存储设施进行单独的针对性优化,不能让秒杀数据对其他数据产生影响,在数据层面对秒杀系统进行专有部署。

就秒杀系统而言,本身也会存在着动态数据和静态数据。动态数据在秒杀期间会容易发生变更,比如秒杀系统的品类、商品的库存和上下架的状态等,都是的动态数据,这些动态数据对时间比较敏感。而像秒杀结果等与用户本身相关的一些数据,可以称为静态数据,因为这些数据在整个秒杀活动期间,基本不会发生变化。

在设计上,需要对这些动态数据和静态数据进行分离,因为数据的更新频率不同,在优化手段和架构设计上也会存在着差异。对动态数据和静态数据进行分离后,也可以将服务端产生的静态数据推送到CDN。

4.4 业务分离

秒杀业务不同于普通的商城业务,秒杀业务的特点就是流量大、持续的时间短,在设计秒杀系统时,需要充分考虑到不同业务之间的影响,做到秒杀业务与其他业务之间的分离。

4.5 系统分离

秒杀系统与其他系统不同,秒杀系统需要承接瞬时高并发流量,而其他大部分系统的流量则比较平缓。一旦将秒杀系统和其他业务系统部署到一起的话,势必会对其他业务系统造成比较大的影响,所以,需要将秒杀系统与其他业务系统进行分离处理。

在系统分离层面,一般在大厂的秒杀系统中会将秒杀详情页系统、秒杀结算页系统、购物车系统和订单系统进行分离,并且会申请单独的域名和负载均衡器等,并且会对相应的微服务集群进行分组隔离。

4.6 流量分离

看到这里,相信大家对秒杀系统的印象更加深刻了。没错,秒杀系统的瞬时流量是巨大的,如果秒杀系统的流量与其他业务系统的流量不加以分离处理,其他系统势必会由于巨大的瞬时流量而导致各种连锁问题,所以,在设计上,务必将秒杀系统与其他业务系统的流量进行分离。

五、限流之道

限流主要是对流量进行限制,对于秒杀这种业务场景来说,流量是瞬时且巨大的,期间流量会在几秒钟之内爬升到峰值,然后马上又掉下来,形成巨大的毛刺峰值,对系统费资源的消耗也是瞬时且巨大的,需要对这些流量进行限制和管控。通常的应对方法主要有:提前预约秒杀、打散客户端流量、消息队列、网关限流、API限流、应用层限流、安全校验、活动校验,秒杀商品校验、秒杀资格校验、风控校验,大厂策略。

5.1 提前预约秒杀

为秒杀系统设计一个预约功能,或者单独设计一个预约系统,用户要想参与秒杀抢购,则需要提前预约商品的抢购,这样可以在参与抢购的用户基数上进行控制,能够提前锁定参与秒杀抢购的用户,而不是整个平台中所有的用户都能参与抢购。这样可以通过将抢购的用户访问控制在预约人数之内,在一定程度上能够大大减少秒杀的峰值流量,对秒杀系统起到一定的防护作用。

5.2 打散客户端流量

一般秒杀系统的客户端也会包含:PC、H5、App和小程序,作为秒杀流量的入口,可以在这些入口端设置答题、验证码和滑块等方式将流量打散,因为每个人输入问答题答案、验证码和滑块的手速不同,就会将瞬时的大并发流量分散到一小段时间内。在秒杀的场景中,不要小看这些处理方式,即使将流量分摊到一秒或者几百毫秒的时间内,也会将流量峰值降低一个甚至几个量级。

例如,在没有将客户端浏览打散的情况下,流量峰值为100万QPS,使用答题、验证码和滑块的方式将流量打散后,流量峰值可能就会下降到80万QPS、60万QPS甚至更低,对秒杀系统能过起到有效的防护作用。

另外,使用问答题、验证码和滑块的方式也能够快速拦截部分刷单流量、防止机器作弊,起到一定的防刷作用。

注意:目前像阿里这样的头部电商平台,已经不会在客户端使用问答题、验证码和滑块等方式将流量打散,更倾向于采用非公平的策略,使用有损逐级限流和分层过滤的方式来达到系统限流的目的。

5.3 消息队列

使用消息队列来削峰填谷,通过消息队列可以将同步的请求改造成异步请求,将超过下游系统处理范围的流量暂时存入消息队列中,下游的系统可以根据自身处理数据的性能来消费队列中的数据。

使用消息队列对抢购下单异步化之后,前端不能及时知晓秒杀的结果数据,需要前端定期查询秒杀的结果数据反馈给用户。在使用消息队列设计异步抢购流程时,有个小技巧:就是前面的请求将商品的库存消耗完之后,在商品库存的缓存中设置一个特殊占位符,让后续的请求能够快速失败,而不再进行后续的业务逻辑处理。

可以使用RocketMQ、Kafka和RabbitMQ等消息中间件来实现请求的异步化和削峰填空,具体使用哪种消息中间件可以根据自身业务进行实际评估。

5.4 网关限流

网关一般是一个系统的入口,可以在网关层对流量进行限流,对超出当前系统流量阈值的请求根据一定的策略进行处理,例如拒绝超出当前系统流量阈值的请求,快速返回失败,也可以将超出阈值的流量缓存起来进行排队,按照一定的顺序消费这些请求,会对下游的业务系统起到一定的防护作用。

5.5 API限流

API限流也就是对接口进行限流,可以使用Google提供的RateLimiter开源包,实现对应的限流策略,在系统中具体的API代码里进行限流。这种方式可以做到针对特定的API接口进行限流。

5.6 应用层限流

应用层的限流可以通过对线程池的限流来实现,实现线程池的限流时,主要是设置并发数限流,可以通过自定义线程池,配置最大的连接数,以请求队列的长度和拒绝策略等参数进行限流,如果队列已满,并且已经达到最大的线程数,多余的请求就会根据具体的拒绝策略进行处理,以达到限流的目的和效果。

5.7 安全校验

安全校验就是要识别出请求的流量哪些是安全流量,哪些是不安全的流量,这里说的不安全的流量指的是友商、黄牛党或者不怀好意的用户发起的刷单流量、CC攻击等,这种流量对系统是有害的,能够消耗大量的系统资源,为系统造成比较大的压力,并且这种方式挤占了正常抢购的通道,对正常参与秒杀活动的用户是不公平的。

5.8 活动校验

活动校验就是接收到请求时,对活动数据进行校验,核对活动是否已经结束、是否下架等等,如果活动已经结束或者已经下架,则在缓存中设置特殊的占位符,对后续的请求进行快速失败处理,不再进行后续的逻辑处理。

做活动校验的原因是用户在客户端看到活动有效,当流量达到服务端时,活动可能已经结束或者失效了,所以需要做活动的校验处理。

5.9 秒杀品校验

秒杀品校验就是在接收到请求时,对当前的商品信息进行校验,核对当前商品是否有效,库存是否充足等。如果商品不再有效、或者库存已经消耗完毕,则在缓存中设置特殊的占位符,对后续的请求进行快速失败处理,不再进行后续的逻辑处理。

做秒杀品校验的原因是用户在客户端看到活动有效,当流量达到服务端时,秒杀品可能已经结束或者失效了,所以需要做秒杀品的校验处理。

5.10 秒杀资格校验

秒杀资格校验主要是对参与秒杀的用户的资格进行校验,比如设计了预约环节时,只有提前预约过秒杀抢购的用户才能参与秒杀。再比如,针对当前活动设置了只能秒杀一次的用户,如果当前用户存在本次活动的秒杀记录,就不再允许二次秒杀等等。还有就是如果对秒杀品设置了只针对某些地区开放秒杀活动,则需要判断用户的所在地是否在开放的地区,如果不在开放秒杀的地区,则不允许抢购等等。

另外,在秒杀的资格校验上,可能存在同一个用户不断伪造请求的现象,需要加强用户唯一身份的校验等逻辑。

5.11 风控校验

一个成熟稳定的秒杀系统的背后会接入风控系统,对整个秒杀活动进行风控处理,风控系统的建设不是一朝一夕就能完成的,建立风控的过程也是比较困难的,这需要建立在大量数据的基础之上,不断的完善用户的画像,需要通过复杂的业务场景的考验,不断的修正风控模型。

5.12 大厂策略

像阿里这种头部互联网公司,其秒杀系统处了会使用上述限流之道进行系统限流外,其处于兼顾用户体验和系统资源的考虑,一般不会采用问答题、验证码或者滑块的方式来打散客户端流量,更倾向于采用非公平的策略,使用有损逐级限流和分层过滤的方式来达到系统限流的目的。

六、快速响应之道

秒杀的场景虽然是高并发、大流量的业务场景,但是在秒杀场景中,需要快速响应用户的请求,不能让用户出现长时间等待的情况,这就需要在秒杀系统的设计上采用一定的策略。对于快速响应来说,可以从多用缓存、本地缓存、分布式缓存、数据尽量少、计算尽量少和流程尽量简单几个方面进行设计。

6.1 多用缓存

像秒杀这种在高并发大流量场景下要求极致体验的系统,缓存是必不可少的,无论是对前端资源还是对后端数据来说,使用缓存都能够极大的提升系统的性能。同时,使用缓存也能够对系统进行一定的防护。

如果系统中没有使用缓存,或者发生了缓存穿透或者雪崩,瞬时的大量请求直接打到数据库,那数据库连接会被瞬间耗尽而导致不可用,进而导致严重的连锁反应,整个系统都会被拖垮,所以,使用缓存是非常重要的。

6.2 本地缓存

在秒杀系统中,为了进一步提升系统的性能,会将一部分非常热点的数据缓存在本地的JVM内存中,接收到请求后,会先从本地缓存中获取数据,如果本地缓存不存在要获取的数据,就会到分布式缓存中进行查询。

6.3 分布式缓存

除了本地缓存外,分布式缓存也是秒杀系统必不可少的,本地缓存的数据有限,只能缓存一部分极度热点的数据,并且这些极度热点的数据开始在本地缓存中也不一定存在,这就需要分布式缓存的存在,如果本地缓存中没有数据,就到分布式缓存查询,尽最大努力提升系统的性能。

6.4 数据尽量少

对于提升系统的响应性能来说,光有缓存还不够,还要在处理的数据上要尽量少,不要查询或者返回无关紧要的数据。因为缓存只是提升了IO的执行效率,但是除了要提升IO的执行效率,还要提升数据在网络中的传输效率、以及内存和磁盘的读写效率。这些都要求我们处理的数据要尽量少。

6.5 计算尽量少

除了数据尽量少以外,对于数据的计算操作也要尽量少,尽量不涉及复杂的计算操作,复杂的计算操作会消耗大量的CPU资源,会极大的影响系统的响应性能。

6.6 流程尽量简单

秒杀系统在流程设计中要尽量简单,不要涉及到复杂的业务流程,流程越简单,处理的业务逻辑越少,性能就越高效。

七、准确一致之道

学习分享,共勉

题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-D9v3SxQ8-1715531892018)]

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统是一种高并发场景下的型应用,其设计需要考虑到多方面的因素,包括系统架构、数据库设计、缓存策略、负载均衡等方面。下面是一个简单的秒系统设计方案: 1. 系统架构 秒系统可以采用分布式架构,将整个系统分成多个模块,包括前端负载均衡、应用服务器、数据库等。前端负载均衡可以使用Nginx或者F5等软硬件负载均衡设备,将请求分发到多个应用服务器上。应用服务器可以采用Tomcat、Jetty等Web容器,处理用户的请求,生成订单,进行库存扣减等操作。数据库可以采用MySQL、Oracle等关系型数据库,也可以采用Redis、MongoDB等NoSQL数据库。 2. 数据库设计 在秒系统中,订单和库存是两个非常重要的数据模块。订单表包括订单ID、用户ID、商品ID、购买数量、订单状态等字段。库存表包括商品ID、库存数量、已售数量、锁定数量等字段。在进行秒的时候,需要先对库存进行检查,如果库存不足,则无法生成订单。 3. 缓存策略 为了提高系统的并发能力,可以采用缓存策略来减轻数据库的负载。可以将商品的信息和库存数量等放入缓存中,当用户请求到达时,先从缓存中查询数据,如果缓存中没有,则从数据库中查询,并将查询结果放入缓存中。同时,库存扣减操作也需要对缓存进行更新。可以使用Redis等内存数据库作为缓存。 4. 负载均衡 为了平衡系统的负载,可以采用多台服务器进行分布式处理。可以使用Nginx等负载均衡设备将请求分发到多台服务器上,每台服务器处理一部分请求。同时,可以使用分布式锁等机制来保证订单生成的唯一性。 以上是一个简单的秒系统设计方案,实际上,秒系统设计需要考虑到多种因素,包括安全性、可靠性、性能等方面,需要根据实际情况进行具体的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值