← 返回首页
🛡️

优雅降级架构

📂 architecture ⏱ 2 min 282 words

优雅降级架构

功能降级

功能降级是在系统压力过大时,关闭非核心功能,集中资源保障核心业务。

// 功能降级配置
@Component
public class FeatureToggleService {
    
    private final Map<String, Boolean> featureFlags = new ConcurrentHashMap<>();
    
    @Value("${feature.recommendation.enabled:true}")
    private boolean recommendationEnabled;
    
    @Value("${feature.comments.enabled:true}")
    private boolean commentsEnabled;
    
    @PostConstruct
    public void init() {
        featureFlags.put("recommendation", recommendationEnabled);
        featureFlags.put("comments", commentsEnabled);
        featureFlags.put("personalization", true);
    }
    
    public boolean isFeatureEnabled(String feature) {
        return featureFlags.getOrDefault(feature, false);
    }
    
    public void degradeFeature(String feature) {
        featureFlags.put(feature, false);
        log.warn("功能降级: {} 已关闭", feature);
    }
}

// 业务层使用
@Service
public class ProductPageService {
    
    public ProductPage getPage(Long productId) {
        ProductPage page = new ProductPage();
        page.setProduct(productRepository.findById(productId));
        
        // 降级时跳过推荐功能
        if (featureToggleService.isFeatureEnabled("recommendation")) {
            page.setRecommendations(getRecommendations(productId));
        }
        
        // 降级时返回缓存的评论
        if (featureToggleService.isFeatureEnabled("comments")) {
            page.setComments(getComments(productId));
        } else {
            page.setComments(getCachedComments(productId));
        }
        
        return page;
    }
}

流量降级

流量降级通过限流、排队等机制控制请求量,保护后端服务。

// 基于令牌桶的限流器
@Component
public class RateLimiter {
    
    private final Map<String, RateLimitConfig> configs = new HashMap<>();
    private final Map<String, TokenBucket> buckets = new ConcurrentHashMap<>();
    
    public boolean tryAcquire(String resource) {
        RateLimitConfig config = configs.getOrDefault(resource, 
            new RateLimitConfig(1000, 100)); // 默认1000 QPS, 100突发
        
        TokenBucket bucket = buckets.computeIfAbsent(resource, 
            k -> new TokenBucket(config));
        
        if (bucket.tryConsume()) {
            return true;
        }
        
        // 触发降级:返回缓存数据或默认值
        log.warn("资源 {} 限流触发,执行降级", resource);
        return false;
    }
}

// 降级处理器
@Component
public class DegradationHandler {
    
    public Response handleRequest(String resource, Supplier<Response> supplier) {
        if (rateLimiter.tryAcquire(resource)) {
            try {
                return supplier.get();
            } catch (Exception e) {
                return fallback(resource);
            }
        }
        return fallback(resource);
    }
    
    private Response fallback(String resource) {
        // 返回缓存数据
        Response cached = cacheService.get(resource);
        if (cached != null) {
            return cached;
        }
        // 返回默认值
        return Response.defaultResponse();
    }
}

自动降级策略

自动降级根据系统负载、错误率等指标自动触发降级。

@Component
public class AutoDegradationService {
    
    @Scheduled(fixedRate = 10000)
    public void checkAndDegrade() {
        double cpuUsage = getSystemCpuUsage();
        double errorRate = getErrorRate();
        int queueLength = getQueueLength();
        
        // CPU 过高时降级非核心功能
        if (cpuUsage > 80) {
            featureToggleService.degradeFeature("recommendation");
        }
        
        // 错误率过高时降级
        if (errorRate > 0.1) {
            featureToggleService.degradeFeature("personalization");
            rateLimiter.adjustLimit(0.5); // 限流50%
        }
        
        // 队列过长时开启排队模式
        if (queueLength > 1000) {
            enableQueueMode();
        }
    }
}

优雅降级的关键是定义清晰的降级策略和恢复机制,确保在系统压力缓解后能自动恢复正常服务。