高并发系统设计与架构演进全景
在真实业务场景中,高并发系统往往不是一次性设计完成,而是在流量、复杂度和稳定性要求不断提升的过程中逐步演进。
在真实业务场景中,高并发系统往往不是一次性设计完成,而是在流量、复杂度和稳定性要求不断提升的过程中逐步演进。
一个成熟的高并发系统设计,核心不在于堆砌组件,而在于:
- 如何识别并定位瓶颈
- 如何进行架构演进
- 如何控制一致性风险
- 如何避免系统级雪崩
- 如何在异常情况下兜底恢复
以下内容在原有架构分析基础上,补充底层原理说明与关键代码示例。
一 分布式锁的底层实现与代码示例
- Redis 分布式锁的安全实现
错误示例(存在误删锁风险):
SET lock_key 1 NX EX 30 DEL lock_key
如果锁过期后被其他线程获取,再执行 DEL 会删除他人的锁。
正确实现必须保证“加锁原子性 + 解锁原子性”。
Java 示例:
String requestId = UUID.randomUUID().toString();
// 加锁
Boolean success = redisTemplate.opsForValue()
.setIfAbsent("order_lock", requestId, 30, TimeUnit.SECONDS);
// Lua 原子解锁
String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
" return redis.call('del', KEYS[1]) " +
"else return 0 end";
redisTemplate.execute(
new DefaultRedisScript<>(luaScript, Long.class),
Collections.singletonList("order_lock"),
requestId
);
底层原理:
- SET NX 保证只有一个客户端能写入
- EX 防止死锁
- Lua 在 Redis 单线程模型中保证原子性
二 幂等设计实现示例
订单幂等最常见方式:数据库唯一索引。
ALTER TABLE orders ADD UNIQUE KEY uk_order_no(order_no);
代码层面:
try {
orderMapper.insert(order);
} catch (DuplicateKeyException e) {
// 已存在订单,直接返回成功
}
本质:用数据库保证“只成功一次”。
三 消息队列可靠性设计
以 Kafka 为例:
生产者可靠性配置:
acks=all
retries=3
enable.idempotence=true
含义:
- acks=all:所有 ISR 副本确认才算成功
- enable.idempotence=true:开启生产者幂等
消费者侧必须:
- 手动提交 offset
- 消费成功后再提交
否则会产生消息丢失或重复。
四 缓存击穿解决示例
逻辑过期实现:
public Object queryWithLogicalExpire(String key) {
RedisData redisData = redisTemplate.get(key);
if (redisData.getExpireTime().isAfter(LocalDateTime.now())) {
return redisData.getData();
}
// 尝试获取互斥锁
if (tryLock("lock:" + key)) {
threadPool.submit(() -> rebuildCache(key));
}
return redisData.getData();
}
核心思想:
- 不让请求阻塞
- 允许返回旧数据
- 后台异步重建缓存
五 限流算法代码示例
令牌桶简单实现:
class TokenBucket {
private long capacity;
private long tokens;
private long refillRate;
private long lastRefillTime;
public synchronized boolean tryAcquire() {
long now = System.currentTimeMillis();
long refill = (now - lastRefillTime) * refillRate / 1000;
tokens = Math.min(capacity, tokens + refill);
lastRefillTime = now;
if (tokens > 0) {
tokens--;
return true;
}
return false;
}
}
底层本质:
- 平滑流量
- 避免瞬时冲击
六 监控与可观测体系说明
常见监控与可观测组件:
Prometheus:
- 开源监控系统
- 基于时间序列数据库
- 主动拉取 metrics
Grafana:
- 可视化面板系统
- 将 Prometheus 数据做图形展示
ELK:
- Elasticsearch:日志存储
- Logstash:日志收集
- Kibana:日志查询与可视化
SkyWalking / Jaeger:
- 分布式链路追踪
- 通过 TraceID 串联微服务调用链
可观测体系的核心是:
- 发现慢请求
- 发现异常节点
- 快速定位瓶颈
七 底层性能思考
高并发的本质问题往往不在框架,而在:
- 线程模型是否合理
- 是否存在锁竞争
- 是否存在大量对象创建导致 GC
- 是否存在数据库行锁
例如 MySQL InnoDB:
- 行锁基于索引
- 未命中索引会升级为表锁
- RR 隔离级别会产生间隙锁
这些都会直接影响高并发性能。
总结
高并发系统的真正核心是:
- 控制资源使用
- 控制并发冲击
- 控制一致性风险
- 控制故障扩散
组件只是工具,理解底层原理,才能真正构建稳定系统。