java高并发如何削峰
高并发削峰策略
削峰(Peak Shaving)指在系统面临突发高并发请求时,通过技术手段平滑流量波动,避免系统过载。Java生态中常用以下方法实现:
消息队列缓冲
引入消息队列(如Kafka、RabbitMQ)作为缓冲层,将瞬时请求转为异步处理。生产者快速接收请求并写入队列,消费者按系统处理能力消费消息。
// Kafka生产者示例
@RestController
public class OrderController {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@PostMapping("/order")
public String createOrder(@RequestBody Order order) {
kafkaTemplate.send("orders", order.toString());
return "Request accepted";
}
}
漏桶算法
固定速率处理请求,超出容量的请求直接拒绝或排队。适合对处理速率有严格要求的场景。
// 简易漏桶实现
public class LeakyBucket {
private final int capacity;
private final long ratePerMillis;
private long lastLeakTime;
private int water;
public LeakyBucket(int capacity, int ratePerSecond) {
this.capacity = capacity;
this.ratePerMillis = 1000 / ratePerSecond;
}
public synchronized boolean tryConsume() {
leak();
if (water < capacity) {
water++;
return true;
}
return false;
}
private void leak() {
long now = System.currentTimeMillis();
long elapsed = now - lastLeakTime;
int leaks = (int)(elapsed / ratePerMillis);
if (leaks > 0) {
water = Math.max(0, water - leaks);
lastLeakTime = now;
}
}
}
令牌桶算法
系统以恒定速率生成令牌,请求获取令牌后才能执行。允许突发流量,但总量受桶大小限制。
// Guava RateLimiter示例
RateLimiter limiter = RateLimiter.create(10.0); // 每秒10个令牌
void handleRequest() {
if (limiter.tryAcquire()) {
processRequest();
} else {
rejectRequest();
}
}
请求排队
使用线程池+队列机制控制并发数,超出队列容量的请求快速失败。
ExecutorService executor = new ThreadPoolExecutor(
10, // 核心线程数
50, // 最大线程数
60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1000), // 队列容量
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
分级降级
实现多级服务降级策略,当压力过大时逐步关闭非核心功能:
- 关闭推荐服务
- 关闭评论功能
- 仅保留核心下单流程
@GetMapping("/product")
public ProductDetail getProduct(@RequestParam String id) {
if (SystemLoad.isHigh()) {
return basicProductService.getBasicInfo(id); // 降级
}
return fullProductService.getFullInfo(id);
}
预热与扩容
结合监控系统实现自动扩容:
- 慢启动预热线程池
- 基于CPU/内存指标自动扩容Pod(K8s)
- 提前预测流量峰值(如双11)进行资源预分配
客户端限流
在客户端或API网关层实施限流:
- Nginx限流模块
- Spring Cloud Gateway的RequestRateLimiter
- 移动端实现请求退避算法(Exponential Backoff)
# Spring Cloud Gateway配置
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
数据分片
将热点数据分散到不同节点:

- 数据库分库分表
- Redis集群分片
- 采用一致性哈希分配请求
选择合适策略需考虑业务特性,通常组合使用多种技术。电商秒杀场景典型方案为:Nginx限流 + 消息队列 + 令牌桶 + 自动扩容 + 降级策略。






