系列导读:本篇将深入讲解高并发系统架构设计的核心原理与实战经验,帮助架构师构建稳定、高效的高并发系统。
文章目录
-
- 一、高并发系统概述
-
- [1.1 什么是高并发?](#1.1 什么是高并发?)
- [1.2 高并发面临的挑战](#1.2 高并发面临的挑战)
- 二、高并发核心指标
-
- [2.1 性能指标](#2.1 性能指标)
- [2.2 稳定性指标](#2.2 稳定性指标)
- 三、架构设计原则
-
- [3.1 核心设计原则](#3.1 核心设计原则)
- [3.2 高并发设计原则](#3.2 高并发设计原则)
- 四、分层架构设计
-
- [4.1 经典分层架构](#4.1 经典分层架构)
- [4.2 各层职责](#4.2 各层职责)
- 五、高并发核心策略
-
- [5.1 缓存策略](#5.1 缓存策略)
- [5.2 限流策略](#5.2 限流策略)
- [5.3 熔断降级策略](#5.3 熔断降级策略)
- [5.4 异步处理策略](#5.4 异步处理策略)
- 六、实战案例分析
-
- [6.1 秒杀系统架构](#6.1 秒杀系统架构)
- [6.2 核心代码实现](#6.2 核心代码实现)
- 总结
一、高并发系统概述
1.1 什么是高并发?
高并发是指系统在短时间内遇到大量请求,需要同时处理多个任务的能力。
┌─────────────────────────────────────────────────────────────┐
│ 高并发场景特征 │
├─────────────────────────────────────────────────────────────┤
│ 🌊 大量请求:QPS 达到万级甚至百万级 │
│ ⚡ 突发流量:秒杀、抢购等场景流量激增 │
│ 🔄 并发处理:多用户同时操作共享资源 │
│ ⏱️ 低延迟:用户对响应时间要求高 │
└─────────────────────────────────────────────────────────────┘
1.2 高并发面临的挑战
| 挑战 | 说明 | 解决思路 |
|---|---|---|
| 性能瓶颈 | 单机资源有限 | 水平扩展、分布式 |
| 数据一致性 | 分布式事务复杂 | 最终一致性、分布式锁 |
| 系统稳定性 | 流量洪峰导致宕机 | 限流、熔断、降级 |
| 资源竞争 | 并发访问共享资源 | 缓存、队列、锁机制 |
二、高并发核心指标
2.1 性能指标
| 指标 | 说明 | 优秀标准 |
|---|---|---|
| QPS | 每秒查询数 | > 10000 |
| TPS | 每秒事务数 | > 5000 |
| RT | 响应时间 | < 100ms |
| 并发数 | 同时处理请求数 | 根据业务定 |
| 成功率 | 请求成功比例 | > 99.9% |
2.2 稳定性指标
| 指标 | 说明 | 优秀标准 |
|---|---|---|
| 可用性 | 系统正常运行时间占比 | > 99.99% |
| MTBF | 平均故障间隔时间 | 越长越好 |
| MTTR | 平均恢复时间 | < 5分钟 |
三、架构设计原则
3.1 核心设计原则
┌─────────────────────────────────────────────────────────────┐
│ 架构设计黄金法则 │
├─────────────────────────────────────────────────────────────┤
│ 1. 单一职责:每个组件只做一件事 │
│ 2. 开闭原则:对扩展开放,对修改关闭 │
│ 3. 依赖倒置:高层不依赖底层,都依赖抽象 │
│ 4. 接口隔离:接口要小而专一 │
│ 5. 迪米特法则:最少知识原则 │
└─────────────────────────────────────────────────────────────┘
3.2 高并发设计原则
| 原则 | 说明 |
|---|---|
| 无状态设计 | 服务节点无状态,便于水平扩展 |
| 服务拆分 | 大系统拆小服务,独立部署扩展 |
| 异步处理 | 非核心流程异步化,提升吞吐 |
| 缓存优先 | 多级缓存减少数据库压力 |
| 限流熔断 | 保护系统不被流量打垮 |
四、分层架构设计
4.1 经典分层架构
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ (Web/App/小程序/PC客户端) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 网关层 │
│ (Nginx/Kong/APISIX/负载均衡) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 应用层 │
│ (微服务集群/API服务) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据层 │
│ (MySQL/Redis/MongoDB/ES) │
└─────────────────────────────────────────────────────────────┘
4.2 各层职责
| 层级 | 职责 | 技术选型 |
|---|---|---|
| 客户端层 | 用户交互、请求发起 | Vue/React/Flutter |
| 网关层 | 路由、限流、认证 | Nginx/Kong/APISIX |
| 应用层 | 业务逻辑处理 | Spring Cloud/Go |
| 数据层 | 数据存储与查询 | MySQL/Redis/ES |
五、高并发核心策略
5.1 缓存策略
java
// 多级缓存架构
public class MultiLevelCache {
// L1: 本地缓存
private Cache localCache = Caffeine.newBuilder()
.maximumSize(10000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
// L2: 分布式缓存
@Autowired
private RedisTemplate redisTemplate;
// L3: 数据库
@Autowired
private UserRepository userRepository;
public User getUser(Long id) {
// 1. 查本地缓存
User user = localCache.getIfPresent(id);
if (user != null) return user;
// 2. 查Redis
user = (User) redisTemplate.opsForValue()
.get("user:" + id);
if (user != null) {
localCache.put(id, user);
return user;
}
// 3. 查数据库
user = userRepository.findById(id);
if (user != null) {
redisTemplate.opsForValue()
.set("user:" + id, user, 30, TimeUnit.MINUTES);
localCache.put(id, user);
}
return user;
}
}
5.2 限流策略
java
// 令牌桶限流
public class TokenBucketLimiter {
private final long capacity; // 桶容量
private final long rate; // 令牌生成速率
private long tokens; // 当前令牌数
private long lastRefillTime; // 上次填充时间
public synchronized boolean tryAcquire() {
refillTokens();
if (tokens > 0) {
tokens--;
return true;
}
return false;
}
private void refillTokens() {
long now = System.currentTimeMillis();
long tokensToAdd = (now - lastRefillTime) * rate / 1000;
tokens = Math.min(capacity, tokens + tokensToAdd);
lastRefillTime = now;
}
}
// 滑动窗口限流
public class SlidingWindowLimiter {
private final long maxRequests;
private final long windowSizeMs;
private final Queue<Long> requestTimes = new LinkedList<>();
public synchronized boolean tryAcquire() {
long now = System.currentTimeMillis();
long windowStart = now - windowSizeMs;
// 移除过期请求
while (!requestTimes.isEmpty()
&& requestTimes.peek() < windowStart) {
requestTimes.poll();
}
if (requestTimes.size() < maxRequests) {
requestTimes.offer(now);
return true;
}
return false;
}
}
5.3 熔断降级策略
java
// 熔断器实现
public class CircuitBreaker {
private enum State { CLOSED, OPEN, HALF_OPEN }
private State state = State.CLOSED;
private int failureCount = 0;
private final int failureThreshold = 5;
private final long timeout = 30000; // 30秒
private long lastFailureTime;
public <T> T execute(Supplier<T> supplier) {
if (state == State.OPEN) {
if (System.currentTimeMillis() - lastFailureTime > timeout) {
state = State.HALF_OPEN;
} else {
throw new CircuitBreakerException("熔断器已打开");
}
}
try {
T result = supplier.get();
onSuccess();
return result;
} catch (Exception e) {
onFailure();
throw e;
}
}
private void onSuccess() {
failureCount = 0;
state = State.CLOSED;
}
private void onFailure() {
failureCount++;
lastFailureTime = System.currentTimeMillis();
if (failureCount >= failureThreshold) {
state = State.OPEN;
}
}
}
5.4 异步处理策略
java
// 消息队列异步处理
@Service
public class OrderService {
@Autowired
private RabbitTemplate rabbitTemplate;
// 下单 - 异步处理库存扣减
public void createOrder(Order order) {
// 1. 创建订单
orderRepository.save(order);
// 2. 异步扣减库存
rabbitTemplate.convertAndSend(
"order.exchange",
"stock.deduct",
order
);
// 3. 异步发送通知
rabbitTemplate.convertAndSend(
"order.exchange",
"notification.send",
order
);
}
}
// 消费者处理
@Component
public class StockConsumer {
@RabbitListener(queues = "stock.queue")
public void deductStock(Order order) {
stockService.deduct(order.getProductId(), order.getQuantity());
}
}
六、实战案例分析
6.1 秒杀系统架构
┌─────────────────────────────────────────────────────────────┐
│ 秒杀系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户请求 ──► CDN ──► Nginx ──► 网关 ──► 秒杀服务 │
│ │ │
│ ▼ │
│ Redis 预减库存 │
│ │ │
│ ▼ │
│ MQ 异步下单 │
│ │ │
│ ▼ │
│ 数据库持久化 │
│ │
└─────────────────────────────────────────────────────────────┘
6.2 核心代码实现
java
// 秒杀核心逻辑
@Service
public class SeckillService {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
// 预热:将库存加载到Redis
public void prepareSeckill(Long productId, int stock) {
redisTemplate.opsForValue()
.set("seckill:stock:" + productId, String.valueOf(stock));
}
// 秒杀:Redis原子操作预减库存
public Result doSeckill(Long userId, Long productId) {
// 1. 检查是否重复购买
Boolean isMember = redisTemplate.opsForSet()
.isMember("seckill:users:" + productId, userId);
if (isMember) {
return Result.fail("不能重复购买");
}
// 2. 预减库存(原子操作)
Long stock = redisTemplate.opsForValue()
.decrement("seckill:stock:" + productId);
if (stock < 0) {
redisTemplate.opsForValue()
.increment("seckill:stock:" + productId);
return Result.fail("库存不足");
}
// 3. 记录购买用户
redisTemplate.opsForSet()
.add("seckill:users:" + productId, userId);
// 4. 异步创建订单
SeckillMessage message = new SeckillMessage(userId, productId);
rabbitTemplate.convertAndSend("seckill.queue", message);
return Result.success("排队中,请稍后查询结果");
}
}
总结
本文我们介绍了:
✅ 高并发概述 :定义、特征、挑战
✅ 核心指标 :QPS、TPS、RT、可用性
✅ 设计原则 :单一职责、无状态、异步处理
✅ 分层架构 :客户端、网关、应用、数据层
✅ 核心策略 :缓存、限流、熔断、异步
✅ 实战案例:秒杀系统架构设计
下篇预告 :微服务架构从入门到落地
作者 :刘~浪地球
系列 :架构设计(一)
更新时间:2026-04-07