高并发架构的核心挑战
当系统面对每秒数十万甚至上百万的请求时,传统的单体架构早已力不从心。高并发架构设计需要在有限资源下,保障系统的可用性、响应速度和数据一致性。本文从限流、降级、熔断三个核心策略入手,深入讲解亿级流量系统的防护体系。
限流算法:控制流量的第一道闸门
| 算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 计数器 | 固定时间窗口计数 | 实现简单 | 临界问题,窗口切换时可能突增2倍 |
| 滑动窗口 | 将窗口分为多个小格子 | 避免临界问题 | 内存开销较大 |
| 令牌桶 | 固定速率放入令牌,请求需获取令牌 | 允许突发流量,长期速率稳定 | 参数调优有门槛 |
| 漏桶 | 请求进入漏桶,以固定速率流出 | 流量平滑输出 | 无法应对突发流量 |
Sentinel:阿里开源的流量防护组件
Sentinel以流量为切入点,提供流量控制、熔断降级、系统负载保护等多维度的服务保障能力:
// 定义限流规则
FlowRule rule = new FlowRule();
rule.setResource("createOrder");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(1000); // QPS上限1000
// 定义降级规则
DegradeRule dRule = new DegradeRule();
dRule.setResource("queryInventory");
dRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
dRule.setCount(0.5); // 异常比例超过50%触发熔断
dRule.setTimeWindow(10); // 熔断持续10秒
服务降级策略
当资源有限时,需要优先保障核心业务:
- 读降级:极端情况下返回缓存数据或静态数据
- 写降级:将同步写转为异步消息队列,错峰处理
- 非核心服务降级:关闭评论、推荐等非核心功能,释放资源给交易链路
- 功能裁剪:关闭列表分页深度、减少返回字段数量
熔断器模式(Circuit Breaker)
// 三种状态转换逻辑:
// Closed(正常)→ 失败率超阈值 → Open(熔断)
// Open → 等待恢复时间 → Half-Open(尝试放行)
// Half-Open → 成功 → Closed | 失败 → Open
@HystrixCommand(fallbackMethod = "fallbackGetPrice",
commandProperties = {
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="20"),
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="50"),
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="5000")
})
public BigDecimal getPrice(Long productId) {
return priceService.fetchPrice(productId);
}
public BigDecimal fallbackGetPrice(Long productId) {
return cacheService.getCachedPrice(productId); // 降级逻辑
}
全链路压测与容量规划
- 流量染色:压测流量打上特殊标识,数据写入影子表
- 压测模型:基于历史流量建模,模拟双十一级别的脉冲流量
- 瓶颈定位:逐步施压,找到系统拐点(QPS-TPS曲线)
- 容量水位:日常流量不超过80%容量,大促前扩容至目标峰值
总结
高并发没有银弹,需要在架构设计之初就建立完善的防护体系:限流保稳定、降级保核心、熔断防爆三板斧缺一不可。压测验证容量、监控发现瓶颈、预案保障兜底,三者缺一不可。

发表评论 取消回复