返回首页

高并发系统设计与架构演进全景

2026年2月12日·后端开发
在真实业务场景中,高并发系统往往不是一次性设计完成,而是在流量、复杂度和稳定性要求不断提升的过程中逐步演进。

在真实业务场景中,高并发系统往往不是一次性设计完成,而是在流量、复杂度和稳定性要求不断提升的过程中逐步演进。

一个成熟的高并发系统设计,核心不在于堆砌组件,而在于:

  • 如何识别并定位瓶颈
  • 如何进行架构演进
  • 如何控制一致性风险
  • 如何避免系统级雪崩
  • 如何在异常情况下兜底恢复

以下内容在原有架构分析基础上,补充底层原理说明与关键代码示例。

一 分布式锁的底层实现与代码示例

  1. 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 隔离级别会产生间隙锁

这些都会直接影响高并发性能。

总结

高并发系统的真正核心是:

  • 控制资源使用
  • 控制并发冲击
  • 控制一致性风险
  • 控制故障扩散

组件只是工具,理解底层原理,才能真正构建稳定系统。

#后端开发#高并发#java