【架构实战】系统设计面试题精选

一、系统设计面试概述

系统设计面试是高级工程师和架构师岗位的必考环节。面试官希望通过一道开放性问题,考察候选人的全局思维、技术深度和工程经验。

二、经典面试题及解析

题目1:设计一个短网址服务

需求分析:

  • 长URL → 短URL的映射
  • 支持高并发访问
  • 短URL尽可能短

核心设计:

java 复制代码
// 基于自增ID + Base62编码
public class ShortUrlService {
    
    private static final String BASE62 = 
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    
    public String encode(long id) {
        StringBuilder sb = new StringBuilder();
        while (id > 0) {
            sb.append(BASE62.charAt((int)(id % 62)));
            id /= 62;
        }
        return sb.reverse().toString();
    }
    
    // 存储:Redis + MySQL双写
    public String shorten(String longUrl) {
        long id = idGenerator.nextId();
        String shortKey = encode(id);
        
        // 写入Redis缓存
        redisTemplate.opsForValue().set(
            "short:" + shortKey, longUrl, 7, TimeUnit.DAYS);
        
        // 写入MySQL持久化
        urlMapper.insert(new UrlMapping(id, shortKey, longUrl));
        
        return "https://t.cn/" + shortKey;
    }
}

题目2:设计一个秒杀系统

核心挑战:

  • 瞬时高并发(10万QPS+)
  • 防止超卖
  • 保证公平性

架构设计:

复制代码
用户请求 → Nginx限流 → API网关
                          ↓
                    Redis预扣库存
                          ↓
                    消息队列异步下单
                          ↓
                    数据库扣减库存
java 复制代码
// Redis预扣库存(Lua脚本保证原子性)
public boolean deductStock(String productId, int count) {
    String script = 
        "if (redis.call('exists', KEYS[1]) == 1) then " +
        "   local stock = tonumber(redis.call('get', KEYS[1])); " +
        "   if (stock >= tonumber(ARGV[1])) then " +
        "       redis.call('decrby', KEYS[1], ARGV[1]); " +
        "       return 1; " +
        "   end; " +
        "end; " +
        "return 0;";
    
    Long result = redisTemplate.execute(
        new DefaultRedisScript<>(script, Long.class),
        Collections.singletonList("stock:" + productId), 
        String.valueOf(count));
    
    return result != null && result == 1;
}

题目3:设计一个消息系统(类似微信)

核心模块:

  • 用户管理
  • 消息收发
  • 离线消息
  • 消息已读/未读

技术选型:

模块 方案
长连接 WebSocket / Netty
消息存储 MySQL + MongoDB
离线消息 Redis队列
群聊 消息扇出
消息同步 推拉结合模式
java 复制代码
// 推拉结合模式
// 推:新消息实时推送
// 拉:客户端上线后拉取离线消息
public List pullOfflineMessages(String userId) {
    String key = "offline:" + userId;
    List messages = redisTemplate.opsForList()
        .range(key, 0, -1);
    redisTemplate.delete(key);
    // 反序列化返回
    return messages.stream()
        .map(this::deserialize)
        .collect(Collectors.toList());
}

题目4:设计一个Feed流系统

三种方案对比:

方案 优点 缺点
推模式(写扩散) 读快 写慢,粉丝多成本高
拉模式(读扩散) 写快 读慢,大V成本高
推拉结合 平衡 实现复杂
java 复制代码
// 推拉结合:普通用户推,大V拉
public List getFeedTimeline(String userId) {
    User user = userMapper.selectById(userId);
    
    if (user.isBigV()) {
        // 大V:拉取关注的人的最新动态
        return feedMapper.pullFromFollowings(userId);
    } else {
        // 普通用户:从收件箱读取
        return redisTemplate.opsForList()
            .range("inbox:" + userId, 0, 50);
    }
}

三、答题框架

系统设计面试的标准答题流程:

  1. 理解需求 - 主动提问,明确功能范围
  2. 高层设计 - 画出整体架构图
  3. 深入设计 - 选择核心组件详细展开
  4. 扩展讨论 - 可扩展性、容错、监控
  5. 总结回顾 - Trade-off取舍说明

四、常见考察点

  • 数据一致性:如何保证分布式场景下的数据一致性
  • 高可用:单点故障如何处理
  • 可扩展:数据量增长10倍怎么办
  • 安全性:防攻击、权限控制
  • 监控:如何发现和定位问题

五、总结

系统设计面试不是要求完美方案,而是考察:

  • ✅ 结构化思维
  • ✅ 技术选型的权衡能力
  • ✅ 实际工程经验
  • ✅ 沟通表达能力

思考题:你遇到过最有趣的系统设计面试题是什么?你是怎么回答的?


个人观点,仅供参考

相关推荐
yhole2 分钟前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
zjjsctcdl3 分钟前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
沐知全栈开发4 分钟前
Java Number & Math 类详解
开发语言
彭于晏Yan4 分钟前
Spring Boot 集成邮件服务实现发送邮件功能
java·spring boot·后端
浮尘笔记4 分钟前
Java Snowy 框架生产环境安全部署全流程(服务器篇)
java·运维·服务器·开发语言·后端
企业架构师老王4 分钟前
2026年国内AI Agent选型指南:企业数字化转型中的非侵入式架构方案深度评测
人工智能·ai·架构
宸津-代码粉碎机5 分钟前
Spring Boot 4.0虚拟线程实战续更预告:高阶技巧、监控排查与分布式场景落地指南
java·大数据·spring boot·分布式·后端·python
Rsun045517 分钟前
6、Java 适配器模式从入门到实战
java·开发语言·适配器模式
MaCa .BaKa10 分钟前
52-考研备考服务平台系统-考研系统
java·spring boot·mysql·考研·tomcat·maven·mybatis
JZC_xiaozhong10 分钟前
2026技术深潜:解构Spring Boot与Spring Framework架构,透视KPaaS集成平台底层逻辑
大数据·spring boot·spring·架构·数据集成与应用集成·异构系统集成·应用对接