第2章:稳定性模式(Stability Patterns)
一、导读
1.1 本章学习目标
第2章讲解构建稳定系统的核心模式:超时、断路器、舱壁、降级和限流。
1.2 为什么第二章如此重要
稳定性模式是生产级软件的基石。没有这些模式,系统在面对故障时会像多米诺骨牌一样崩溃。
1.3 核心问题引导
为什么必须设置超时?
断路器如何防止级联故障?
舱壁模式如何隔离故障?
降级策略如何保持核心功能?
限流如何保护系统?
二、核心概念详解
2.1 超时
所有外部调用都必须设置超时:
java
// 连接超时 + 读取超时
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.timeout(Duration.ofSeconds(10))
.build();2.2 断路器
断路器防止级联故障:
状态转换:
CLOSED → OPEN(失败次数超过阈值)
OPEN → HALF_OPEN(超时后)
HALF_OPEN → CLOSED(成功)或 OPEN(失败)2.3 舱壁模式
舱壁模式隔离故障,防止一个组件的故障影响整个系统:
线程池隔离:
- 用户服务:独立线程池(20线程)
- 订单服务:独立线程池(30线程)
- 支付服务:独立线程池(10线程)
一个服务耗尽线程不会影响其他服务2.4 降级
当依赖不可用时,提供降级响应:
java
public String getUser(String id) {
try {
return userService.getUser(id);
} catch (Exception e) {
// 降级:返回缓存数据
return cache.get("user:" + id);
}
}2.5 限流
限流保护系统免受过载:
java
// 令牌桶限流
RateLimiter limiter = RateLimiter.create(100); // 100 QPS
public Response handle(Request request) {
if (!limiter.tryAcquire()) {
return Response.status(429).build(); // Too Many Requests
}
return process(request);
}三、实战案例
3.1 综合稳定性方案
java
public class ResilientService {
private final CircuitBreaker circuitBreaker;
private final RateLimiter rateLimiter;
private final Cache fallbackCache;
public String call(String key) {
// 限流
if (!rateLimiter.tryAcquire()) {
throw new RateLimitException();
}
// 断路器
return circuitBreaker.execute(() -> {
try {
return remoteCall(key);
} catch (Exception e) {
// 降级
return fallbackCache.get(key);
}
});
}
}四、本章小结
稳定性模式是生产级软件的核心:超时防止无限等待,断路器防止级联故障,舱壁隔离故障,降级保持核心功能,限流保护系统。
五、思考与练习
如何确定合适的超时时间?
断路器的阈值如何设置?
舱壁模式有哪些实现方式?
降级策略如何设计?
限流算法有哪些?各有什么优缺点?