应对系统突发流量峰值,通过 “服务端防护 + 客户端减量” 双维度优化,保障核心功能(如支付、下单、登录)高可用,降低系统过载风险,提升用户体验。
核心服务定义:直接影响用户核心体验、涉及交易 / 数据一致性的链路,包括支付服务、下单服务、用户登录服务、核心数据查询服务。
辅助服务定义:非核心交互、非实时性需求的功能,包括日志统计服务、消息推送服务、非实时数据分析服务、积分计算服务、营销活动服务(弹窗 / 推荐)。
独立部署:辅助服务采用微服务架构(Spring Cloud/Dubbo)独立部署,通过 Docker 容器化分配专属 CPU、内存、带宽资源,与核心服务物理隔离,避免资源争抢。
异步解耦:核心服务与辅助服务通过消息队列(Kafka/RabbitMQ)实现异步通信,核心服务仅负责发送消息至队列,无需等待辅助服务执行结果,同步转异步降低核心接口响应时间。
数据库隔离:核心服务使用主库处理读写操作,辅助服务接入从库 / 只读库,通过数据库中间件(MyCat/Sharding-JDBC)控制权限,禁止辅助服务直接操作核心主库,减少主库压力。
技术选型:基于配置中心(Nacos/Apollo)实现动态开关,支持全局降级、局部降级(按地区、用户群体、接口维度)。
开关特性:支持毫秒级推送、灰度生效(按比例开启)、快速回滚,提供开关操作审计日志,便于追溯。
| 降级级别 | 触发条件 | 关闭功能 | 技术实现 |
|---|---|---|---|
| 轻度降级 | 系统负载轻度升高(CPU 70%-80%、核心接口响应时间 300ms-500ms) | 评论、点赞、分享、收藏等非核心交互功能 | 配置中心开关触发,接口返回预设空数据(如空列表) |
| 中度降级 | 系统负载中度过载(CPU 80%-90%、核心接口响应时间 500ms-1s) | 推荐列表、营销弹窗、非实时数据统计功能 | 关闭对应服务接口路由,前端屏蔽功能入口 |
| 重度降级 | 系统负载严重过载(CPU >90%、核心接口响应时间 >1s 或错误率 >5%) | 仅保留核心交易(支付 / 下单)、登录功能,其余全部关闭 | 网关层拦截非核心接口请求,直接返回降级提示 |
接口层:降级触发后,接口返回统一格式的兜底响应(如 {"code":200,"msg":"当前流量较大,功能暂不可用","data":[]}),避免抛异常导致前端崩溃。
前端适配:服务端通过响应头返回降级标识(如 Degrade: true),前端识别后展示友好提示文案,不影响核心功能使用。
| 限流类型 | 适用场景 | 技术选型 | 核心配置 |
|---|---|---|---|
| 单机限流 | 单服务实例级限流,控制单节点并发 | Guava RateLimiter(令牌桶算法) | 核心接口单实例 QPS 阈值(如支付接口 500 QPS / 实例),非核心接口 200 QPS / 实例 |
| 分布式限流 | 集群部署场景,控制全链路总并发 | Redis + Lua 脚本(原子性保证) | 基于接口名 + 用户类型作为 key,设置全集群 QPS 阈值(如支付接口全集群 5000 QPS),Lua 脚本实现令牌发放与计数 |
| 分级限流 | 区分接口重要性、用户价值 | 结合 Nacos 配置中心动态调整阈值 | 核心接口阈值高于非核心接口 50%;VIP 用户阈值高于普通用户 30%,通过用户身份标识(token / 用户 ID)区分 |
技术选型:Sentinel(轻量级、易集成),替代 Hystrix 实现熔断降级。
核心配置:
熔断触发条件:接口错误率 >50% 或响应时间 >1s,持续时间 10s。
熔断状态:熔断后进入 5s 半开状态,期间允许少量请求试探,若成功率 >90% 则恢复正常,否则继续熔断。
兜底处理:熔断触发后,返回预设兜底数据或提示 “服务暂时不可用,请稍后重试”。
监控指标:核心接口 QPS、响应时间、错误率、系统 CPU / 内存 / 带宽使用率、消息队列堆积量、数据库连接数。
告警方式:基于 Prometheus + Grafana 可视化监控,设置阈值告警(如 CPU>80% 触发钉钉 / 短信通知),告警分级(P0 紧急 / P1 重要 / P2 普通)。
链路追踪:集成 SkyWalking/Zipkin 实现分布式链路追踪,快速定位限流 / 降级触发源头。
测试工具:JMeter(批量接口压测)、Locust(高并发场景模拟)。
测试场景:模拟 10 倍日常流量,针对核心接口(支付 / 下单)进行持续 30 分钟压测,验证限流、降级策略有效性,记录系统瓶颈(如数据库连接池上限、缓存穿透风险)。
技术实现:基于网关(Spring Cloud Gateway/NGINX)实现流量路由,支持按用户比例(1%/10%/50%)灰度新功能 / 新策略。
回滚机制:灰度期间通过监控系统实时观测指标,若出现错误率升高、响应时间延长等问题,1 分钟内切换路由至旧版本,实现快速回滚。
重复请求合并:多页面共用的接口(如用户信息查询、全局配置查询),通过前端全局状态管理(Vuex/Redux)缓存数据,单次请求全局复用,避免多页面重复调用。
小接口批量合并:将多个独立小接口(如用户头像查询、昵称查询、积分查询)合并为一个批量查询接口,减少 HTTP 网络往返次数,降低服务器连接开销。
懒加载实现:列表页、滚动加载场景,采用 “滚动到底部触发加载” 机制,替代一次性加载全量数据,初始仅加载首屏数据(如 20 条)。
无效请求取消:页面切换、组件卸载时,通过 Axios 拦截器取消未完成的请求(如 CancelToken),避免无效请求占用服务器资源。
节流:高频触发操作(如按钮点击、下拉刷新),设置 1s 内仅触发 1 次,通过定时器控制请求发送时机。
防抖:输入框搜索场景,设置 “停止输入后 500ms 触发请求”,避免输入过程中频繁发送查询请求。
| 缓存类型 | 存储介质 | 适用数据 | 缓存时效 | 优势 |
|---|---|---|---|---|
| 内存缓存 | 前端内存(Vuex/Redux) | 高频访问的热点数据(用户信息、首页配置、导航菜单) | 页面会话期间(关闭页面失效) | 读取速度最快(毫秒级),无持久化开销 |
| 持久化缓存 | LocalStorage/SessionStorage | 跨页面复用数据(商品详情、分类数据) | 自定义时效(默认 10 分钟) | 页面刷新后不失效,减少重复请求 |
时间失效:按数据更新频率设置差异化时效,静态数据(如分类字典)缓存 1 小时,半动态数据(商品详情)缓存 10 分钟,动态数据(实时榜单)不缓存。
主动失效:服务端数据更新时,通过 WebSocket 推送缓存失效通知(如 “商品 ID:123 详情更新”),客户端接收后清除对应缓存键,下次请求触发新数据加载。
缓存未过期:直接返回缓存数据,不发起接口请求。
缓存过期:先返回旧缓存数据保证用户体验,同时异步发起接口请求获取新数据,更新缓存后下次生效,避免用户等待加载。
接口响应拦截:统一拦截服务端返回的限流 / 降级响应(如 code=429 限流、code=200 + 降级标识),展示对应提示文案(如 “当前流量较大,请稍后重试”“XX 功能暂不可用,感谢理解”)。
功能入口屏蔽:降级状态下,前端自动隐藏对应功能入口(如关闭营销活动入口、灰色化评论按钮),避免用户无效操作。
重试策略:非核心接口(如列表查询、推荐查询)请求失败后,采用指数退避重试机制,重试 3 次,间隔分别为 1s、2s、4s,避免频繁重试加重服务器负担。
核心接口限制:支付、下单等核心写接口禁止重试,防止重复提交,失败后引导用户手动重试。
超时控制:所有接口设置默认超时时间 10s,超时后返回兜底数据(如缓存旧数据、默认空列表),避免页面长时间空白。
数据压缩:通过 gzip 压缩请求 / 响应数据体积,减少网络传输耗时;图片采用 WebP 格式,降低加载带宽。
本文作者:万合天宜
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!