构建高可用系统的五大设计模式

Nina Santos | 2026-08-26T23:03:47 | DevOps, Cloud

详解熔断器、重试与退避、限流、舱壁隔离和超时控制五种容错设计模式的原理与实现。

# 构建高可用系统的五大设计模式 ## 一、熔断器(Circuit Breaker) 当下游服务频繁失败时,自动"熔断"请求,避免级联故障。 ```java // 使用 Resilience4j @CircuitBreaker(name = "paymentService", fallbackMethod = "paymentFallback") public PaymentResult processPayment(PaymentRequest request) { return paymentClient.charge(request); } public PaymentResult paymentFallback(PaymentRequest request, Exception ex) { // 降级:将支付请求放入队列,稍后重试 paymentQueue.enqueue(request); return PaymentResult.pending("支付处理中,请稍后查看结果"); } ``` ```yaml resilience4j: circuitbreaker: instances: paymentService: failure-rate-threshold: 50 # 失败率超过 50% 触发熔断 wait-duration-in-open-state: 30s # 熔断 30 秒后半开 sliding-window-size: 10 # 统计窗口大小 minimum-number-of-calls: 5 # 最少 5 次调用才统计 ``` ## 二、重试与指数退避 ```java @Retry(name = "emailService", fallbackMethod = "emailFallback") public void sendEmail(EmailRequest request) { emailClient.send(request); } ``` ```yaml resilience4j: retry: instances: emailService: max-attempts: 3 wait-duration: 1s exponential-backoff-multiplier: 2 # 1s -> 2s -> 4s retry-exceptions: - java.io.IOException ignore-exceptions: - my.app.InvalidEmailException # 业务异常不重试 ``` ## 三、限流(Rate Limiting) ```java @RateLimiter(name = "apiRateLimit", fallbackMethod = "rateLimitFallback") @GetMapping("/api/search") public SearchResult search(@RequestParam String query) { return searchService.search(query); } public SearchResult rateLimitFallback(String query, RequestNotPermitted ex) { throw new TooManyRequestsException("请求过于频繁,请稍后重试"); } ``` ```yaml resilience4j: ratelimiter: instances: apiRateLimit: limit-for-period: 100 # 每个周期允许 100 次 limit-refresh-period: 1s # 周期为 1 秒 timeout-duration: 0 # 不等待,直接拒绝 ``` ## 四、舱壁隔离(Bulkhead) 为不同服务分配独立的线程池,防止一个慢服务拖垮整个系统。 ```java @Bulkhead(name = "reportService", type = Bulkhead.Type.THREADPOOL) public CompletableFuture generateReport(ReportRequest request) { return CompletableFuture.supplyAsync(() -> reportService.generate(request)); } ``` ```yaml resilience4j: bulkhead: instances: reportService: max-concurrent-calls: 10 # 最大并发数 max-wait-duration: 5s # 等待队列超时 ``` ## 五、超时控制 ```java @TimeLimiter(name = "searchTimeout", fallbackMethod = "searchTimeoutFallback") public CompletableFuture search(String query) { return CompletableFuture.supplyAsync(() -> searchService.search(query)); } public CompletableFuture searchTimeoutFallback(String query, TimeoutException ex) { return CompletableFuture.completedFuture(SearchResult.empty("搜索超时,请重试")); } ``` ## 模式组合建议 推荐组合顺序:限流 -> 熔断 -> 重试 -> 超时 -> 舱壁 ``` 请求 -> 限流(防止过载) -> 熔断(快速失败) -> 重试(处理瞬时错误) -> 超时(控制等待时间) -> 舱壁(资源隔离) -> 下游服务 ```

← Back to Blog