题目
设计高可用的电商促销系统
信息
- 类型:问答
- 难度:⭐⭐
考点
高可用架构设计, 容错机制, 流量控制, 数据一致性, 灾备方案
快速回答
设计高可用电商促销系统的核心要点:
- 多级冗余架构:部署多地域多可用区,使用负载均衡分发流量
- 熔断降级机制:对核心服务(库存/订单)实施熔断策略,配置降级预案
- 异步解耦:通过消息队列分离促销计算与订单处理
- 数据分片+副本:数据库采用分片部署,读写分离+多副本
- 全链路监控:实现秒级监控和自动故障转移
1. 系统架构设计
分层冗余架构:
采用多地域部署(如华东/华北集群),每个集群包含:
- 前端:CDN + 负载均衡(Nginx HA集群)
- 应用层:无状态服务集群(自动伸缩组)
- 数据层:MySQL分片集群 + Redis多副本
// 伪代码:负载均衡健康检查配置(Nginx)
upstream backend {
server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.2:8080 backup; // 备用节点
check interval=5000 rise=2 fall=3 timeout=1000;
}2. 容错机制实现
熔断降级策略:
- 库存服务熔断:当错误率>30%时触发熔断,返回缓存库存值
- 降级预案:促销计算超时后返回基础折扣(如9折)
// 伪代码:Hystrix熔断配置
@HystrixCommand(
fallbackMethod = "getStockFallback",
commandProperties = {
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="30"),
@HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="10000")
}
)
public int getStock(String itemId) { /* ... */ }3. 流量控制方案
- 入口限流:API网关实现令牌桶限流(如Guava RateLimiter)
- 队列缓冲:Kafka承接秒杀请求,控制下游处理速率
- 静态化降级:将商品页生成静态HTML缓存
// 令牌桶限流示例
RateLimiter limiter = RateLimiter.create(1000); // 每秒1000请求
if(limiter.tryAcquire()) {
processRequest();
} else {
return "系统繁忙,请重试";
}4. 数据一致性保障
最终一致性方案:
1. 订单创建时写入Redis并发送MQ
2. 消费服务更新数据库
3. 对账服务修复差异数据

5. 灾备与演练
- 多活数据中心:华东/华北双活,DNS智能路由
- 故障切换流程:
1. 监控系统检测到区域故障
2. 自动切换DNS解析权重
3. 数据层主从切换(VIP漂移) - 混沌工程:定期注入网络延迟、节点故障等异常
最佳实践
- 采用「舱壁隔离」模式:促销服务与核心订单服务资源隔离
- 黄金指标监控:QPS、错误率、响应时间(P99)、系统负载
- 容量规划:通过压测确定单节点承载上限,设置80%水位告警
常见错误
- ❌ 单点故障:未对配置中心/注册中心做高可用
- ❌ 级联雪崩:服务间同步调用无超时控制
- ❌ 数据丢失:MQ未配置持久化和副本
- ❌ 过载保护缺失:突发流量直接击穿数据库
扩展知识
- Region/Zonal架构:AWS Availability Zone的设计哲学
- SLA量化:99.95%可用性 = 年故障时间≤4.38小时
- 容错模式:Circuit Breaker vs Bulkhead vs Retry
- 前沿方案:Service Mesh(Istio)实现细粒度流量控制