202511软考高级论文,「秒杀」场景解决方案
软考高级有3个科目:综合知识、案例分析、论文,考试通过的及格分数为 45/75,其难点在于必须三门均通过,任何一门低于45分都意味着败北☹️
论文四选一:云原生数据库、系统性能测试、秒杀场景、Serverless无服务器架构。 通过社交平台上考生的反馈,绝大多数考生选择第3题「秒杀」,因为问题2相对容易回答,我也选的该题。
秒杀场景解决方案:扩容、动静分离、缓存、限流、降级。
题目中的内在要求是将解决方案应用在秒杀场景,但是在写作时我却只围绕其核心技术泛泛而谈,而没有重点区别于秒杀场景的领域特点...
扩容
一句话描述:扩容技术(弹性伸缩)是应对负载流量变化的核心手段,分为分为纵向扩容(增加配置)和横向扩容(增加服务器副本),其中横向扩容是云原生推荐的,可依赖 Kubernetes 的 HPA 实现。
扩容技术是系统应对负载增长的核心手段,通常指为了提高系统的处理能力,而采取的增加计算资源或其他资源的一系列措施,以此来提升系统的性能。一般地,扩容可分为两类:
- 纵向扩容(横向扩容):通过升级单台服务器的硬件配置提升性能,比如把 CPU 从4核换成32核、内存从16GB升级到64GB、硬盘从磁盘更换为 SSD。
- 横向扩容(水平扩容):通过增加服务器节点数量扩展集群规模,比如从1台服务器增加到10台,节点地位平等、协同工作。
横向扩展是云原生的核心内涵之一,通常称之为「弹性伸缩」,容器技术和容器编排工具 Kubernetes(K8s)是实现弹性伸缩的核心载体。其核心逻辑是:通过容器标准化应用部署,再由 K8s 动态感知负载变化,自动调整容器实例数量,实现按需分配资源。
K8s 支持横向扩展(HPA)和纵向扩展(VPA),前者是官方原生支持并推荐的
K8s 中,容器被封装为 Pod(最小部署单元,可包含1个或多个关联容器),弹性伸缩的本质是动态调整 Pod 的数量。HorizontalPodAutoscaler(HPA) 是 K8s 实现横向弹性伸缩的核心组件,工作流程如下:
步骤一:定义伸缩规则
弹性伸缩支持命令式和生命式 API
用户通过 YAML 配置 HPA,指定:
- 目标对象(如 Deployment 管理的 Pod 集群);
- 触发条件(如 CPU 利用率≥70%、内存使用率≥80%、自定义指标如每秒请求数(RPS)≥1000);
- 伸缩范围(最小副本数、最大副本数,如
minReplicas: 2,maxReplicas: 10)。
示例配置(基于 CPU 和内存的 HPA):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app # 目标Deployment名称
minReplicas: 2 # 最小Pod数
maxReplicas: 10 # 最大Pod数
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU利用率≥70%触发扩容
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80 # 内存利用率≥80%触发扩容步骤二:监控指标采集
K8s 通过 metrics-server(基础指标采集器)实时收集 Pod 的 CPU、内存使用率,或通过 Prometheus 等工具采集自定义指标(如请求量、队列长度),并将指标同步给 HPA。
步骤三:自动决策与执行
HPA 定期(默认 15 秒)对比当前指标与预设阈值:
- 若指标超过阈值(如 CPU 达 80%),则计算需要新增的 Pod 数量(基于 “期望副本数 = 当前副本数 × 当前指标 / 目标指标” 公式),并通知 Deployment 扩容。
- 若指标低于阈值(如 CPU 降至 30%),则按规则减少 Pod 数量(避免频繁波动,默认需满足 5 分钟稳定低负载才缩容)。
- Deployment 接到指令后,通过 ReplicaSet 创建 / 删除 Pod,K8s 的调度器(Scheduler)会将新 Pod 分配到资源充足的节点上。
动静分离
一句话描述:动静分离指的是将静态资源与动态资源分离部署,实现性能、稳定性、扩展性、安全性等全面提升。
静态资源:HTML、JavaScript、CSS、图片、字体、音频、视频等内容固定不变或更新频率极低的资源
动态资源:随用户请求、时间或业务逻辑动态生成的内容,如实时数据接口(JSON)。
典型的动静分离场景为前后端分离项目:
- 前端 Web 开发:Vue 框架,基于 Vite 构建为静态资源分发包
dist,并使用 Nginx 静态代理。 - 服务端开发:Spring 框架,基于 Maven 构建为 Jar(内置 Tomcat)
静态资源可使用 CDN+缓存+压缩实现高效分发,核心是减少传输成本。
动态资源通过缓存+集群+异步实现高效计算,核心是减少处理耗时。
在运维实现上,使用容器技术进行封装,可以很容易实现弹性伸缩。一般地,静态资源是无状态的,需要资源较少,且更容易实现回滚。
此外,图片、视频、音频等较大的静态资源,推荐使用 S3 对象存储。
缓存
缓存技术是提升系统读写性能、降低后端负载的核心手段,核心是将高频访问的数据暂存到高速存储介质中,减少对低速数据源(如数据库、磁盘)的直接访问。
缓存技术的两大依据:
- 局部性原理(时间局部性和空间局部性):系统中大部分访问集中在少量热点数据上
- 存储介质访问速度与容量(价格)的矛盾:Cache、内存、SSD、磁盘的访问速度和价格依次递减,且与CPU的「交互距离」逐渐增大
核心目标是提升查询QPS、降低数据库压力、改善用户体验。
缓存技术一般是基于内存实现的,对比参照系是数据库磁盘访问
常见的缓存技术组件包括本地缓存 Caffeine,甚至是 HashMap,分布式缓存 Memcached、Redis。缓存的核心应用场景是多读少写,因为带来数据一致性问题。比较典型的缓存问题:
- 缓存一致性:延迟双删、基于消息队列的最终一致性
- 缓存命中:缓存击穿、缓存雪崩、缓存穿透
- 高可用:Redis 部署模式支持单机、主从、哨兵和集群,需要考虑业务场景或系统质量属性来进行技术选型。
在秒杀场景中,可以提前将相关的动态资源和静态资源加载到缓存(内存)中,如用户参与资格、活动状态、商品信息等,以减少访问数据库的磁盘IO,实现高并发与快速响应。
限流和降级
限流是通过设定阈值,限制单位时间内的请求数量或并发数,避免系统资源被耗尽,可使用令牌桶算法实现限流。例如某系统提供服务的最大并发量是1000,当超过该阈值时直接返回服务不可用,几乎不消耗系统资源。
降级是当系统出现高负载、依赖服务故障时,主动关闭非核心功能或返回兜底数据,优先保障核心功能可用。例如某流媒体网站最大并发量为1000,当并发量超过阈值时,将上传视频、特效制作等模块功能关闭,只保留视频播放、评论等核心功能以尽可能保证多数用户的正常使用。
限流类似于去下馆子吃饭排队等座,降级类似于限制餐品品类以保证出餐速度和翻台率。
参考
- Kubernetes 文档,HPA 横向伸缩,https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/