目录

分布式系统设计架构能力

分布式系统设计(架构能力)

一、微服务架构
  1. 服务治理

    • Nacos 注册中心(AP模式)

      • CAP选择 :Nacos 默认采用 AP 模式(可用性 + 分区容忍性),通过心跳检测实现服务健康管理。
      • 服务发现 :客户端定时拉取服务列表,支持权重路由和元数据过滤。
      • 配置管理 :通过 dataIdgroup 动态推送配置,支持灰度发布。
    • Sentinel 熔断规则持久化

      • 规则存储 :将流控、熔断规则持久化到 Nacos/ZooKeeper,避免重启丢失。
      • 动态更新 :通过 DataSource 接口监听配置中心变化,实时生效。
      // 示例:Sentinel 规则持久化到 Nacos 
      ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>( nacosServerAddr, groupId, dataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}) ); FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
  2. 分布式事务

    • Seata AT模式

      • 两阶段流程
        1. 一阶段 :执行业务 SQL,生成 UNDO_LOG(数据快照)。
        2. 二阶段 :提交时删除 UNDO_LOG;回滚时通过 UNDO_LOG 恢复数据。
      • 全局锁 :TC(事务协调器)通过全局锁避免脏写。
    • 最大努力通知型事务

      • 适用场景 :跨系统最终一致性(如支付成功后通知商户)。
      • 实现步骤
        1. 本地事务提交后,异步发送通知消息。
        2. 消息队列保证至少一次投递,接收方需幂等处理。
  3. 网关设计

    • Spring Cloud Gateway 过滤器链

      • 核心过滤器

        • GlobalFilter :全局过滤(如鉴权、日志)。
        • GatewayFilter :路由级过滤(如添加请求头)。
      • 自定义过滤器

        @Component 
        public class AuthFilter implements GlobalFilter { 
            @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 
                if (!checkAuth(exchange.getRequest())) { 
                    return exchange.getResponse().setComplete(); 
                    // 拦截 
                } 
            return chain.filter(exchange); } }
    • 动态路由配置

      • 基于Nacos :监听 Nacos 配置变化,刷新路由表。
      • API 动态更新 :通过 RouteDefinitionRepository 接口实现。

二、中间件核心
  1. Redis

    • 集群模式

      • Cluster分片
        • 16384个哈希槽,每个节点负责部分槽位。
        • 客户端路由:通过 CRC16(key) % 16384 计算槽位。
      • Codis方案
        • 代理层(Codis-Proxy)负责分片,依赖 ZooKeeper 维护元数据。
    • 持久化策略

      • RDB :定时快照,恢复快但可能丢失数据。
      • AOF :追加日志,数据安全但文件较大。
      • 混合模式 :RDB 全量 + AOF 增量(Redis 4.0+)。
    • 缓存问题解决方案

      • 穿透 :布隆过滤器( RedissonBloomFilter )拦截无效请求。
      • 击穿 :互斥锁( SET key value NX PX 3000 )防止并发重建。
      • 雪崩 :随机过期时间(基础过期时间 + 随机偏移量)。
  2. Kafka

    • ISR机制

      • In-Sync Replicas :与 Leader 保持同步的副本集合。
      • Leader选举 :当 Leader 失效时,从 ISR 中选择新 Leader。
    • 零拷贝技术

      • sendfile系统调用 :数据直接从磁盘文件传输到网卡,绕过用户态。
    • Exactly-Once语义

      • 幂等生产者 :通过 PID + Sequence Number 去重。
      • 事务消息 :跨分区原子性写入(需配合事务协调器)。
  3. RocketMQ

    • 事务消息流程

      1. 发送半消息(对消费者不可见)。
      2. 执行本地事务,提交或回滚。
      3. Broker 根据事务状态提交或丢弃消息。
    • 顺序消息实现

      • MessageQueueSelector :通过相同选择策略(如订单ID哈希)将消息发送到同一队列。
      • 消费者单线程顺序消费。

三、高可用设计
  1. 限流降级

    • 滑动窗口算法

      • 实现 :将时间划分为多个小窗口,统计窗口内请求量。
      • 优势 :比固定窗口更平滑,避免临界突发流量。
    • 令牌桶实现(Resilience4j)

      // 配置每秒10个令牌 
      RateLimiterConfig config = RateLimiterConfig
          .custom()                     
          .limitRefreshPeriod(Duration.ofSeconds(1)) 
          .limitForPeriod(10) 
          .build(); 
      RateLimiter limiter = RateLimiter.of("apiLimiter", config);
  2. 容灾方案

    • 同城双活

      • 数据同步 :基于数据库主从复制或 DRBD 块级同步。
      • 流量切换 :DNS 或负载均衡器(如 Nginx)切换流量。
    • 异地多活

      • 单元化路由 :按用户 ID 哈希路由到指定机房(如用户A固定访问北京机房)。
      • 数据最终一致 :通过消息队列异步同步数据。
  3. 压测实战

    • JMeter全链路压测

      1. 脚本录制 :使用 JMeter 代理服务器录制用户操作。
      2. 参数化 :CSV 文件驱动多用户登录(不同账号)。
      3. 分布式压测 :控制机(Master)调度多台压力机(Slave)。
      4. 监控指标 :TPS、响应时间、错误率、资源利用率(CPU/内存)。
    • 结果分析

      • 瓶颈定位 :数据库慢 SQL、线程池满、缓存命中率低。
      • 优化建议 :增加索引、调整线程池参数、预热缓存。

四、总结与实战案例

案例:电商大促系统设计

  • 挑战 :秒杀场景下的高并发(10万QPS)、数据一致性。
  • 解决方案
    1. 流量削峰 :MQ 队列缓冲请求,异步处理订单。
    2. 库存扣减 :Redis Lua 脚本保证原子性,异步同步到数据库。
    3. 降级策略 :核心功能(下单)优先,非核心功能(推荐)降级。

通过深入理解上述技术点,并结合实际场景灵活运用,能够设计出高可用、可扩展的分布式系统。