51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个支持百万级用户并发的用户认证系统,要求响应时间低(<100ms),且具备高可用性和可扩展性。请描述系统架构,包括负载均衡、缓存、数据库等组件的选择及设计思路。

微软Software Engineer Intern难度:中等

答案

1) 【一句话结论】:为支持百万级并发且响应时间<100ms的认证系统,核心采用无状态分布式架构,通过负载均衡分发请求、多级缓存(本地+Redis)减少数据库压力、数据库读写分离提升读性能,确保高可用与可扩展。

2) 【原理/概念讲解】:
老师解释关键概念:

  • 无状态服务设计:服务不存储用户会话状态,每次请求都从最新数据源(缓存或数据库)获取信息。类比:快递员每次取件都看最新的地址单,不需要记住之前送过的地址,这样即使增加更多快递员(服务实例),也能独立处理请求,便于水平扩展。
  • 缓存分层策略:分为本地缓存(如进程内LRU缓存)和分布式缓存(如Redis)。本地缓存用于高频访问的用户信息(如用户ID到用户名的映射),访问速度极快(纳秒级);分布式缓存用于存储用户Token、Session等,支持多实例共享,减少数据库查询压力。缓存失效机制(如TTL)确保数据一致性。
  • 数据库读写分离:主库负责写操作(如用户登录记录、Token生成),从库负责读操作(如用户信息查询)。主从同步通过异步复制,提高读性能,避免主库因读压力过大导致响应延迟。同时,从库数量可扩展,支持高并发读请求。

3) 【对比与适用场景】:

组件定义特性使用场景注意点
负载均衡器(如Nginx)分发请求到后端服务实例的组件轻量,支持健康检查、会话保持、多协议高并发请求分发,保证服务可用性需配置健康检查,避免故障实例接收请求;会话保持需结合无状态设计
Redis(分布式缓存)内存数据库,支持高速读写低延迟,支持数据持久化,集群扩展存储用户Token、Session、热点用户信息需考虑数据一致性与过期策略,避免缓存雪崩
MySQL(读写分离)关系型数据库,支持事务事务一致性,主从同步存储用户基本信息、认证记录等持久化数据需控制主从同步延迟,避免数据不一致;从库数量需足够

4) 【示例】(用户登录流程):

  • 请求:客户端发送登录请求(用户名/密码)。
  • 负载均衡:Nginx将请求分发到认证服务实例(如实例1)。
  • 本地缓存检查:实例1先查进程内缓存(如user_cache),若存在用户信息(如用户名->用户ID映射),直接返回Token。
  • 分布式缓存检查:若本地缓存未命中,查询Redis(如user:token:{username}),若存在Token,验证Token有效性(如签名校验),返回用户信息。
  • 数据库查询:若Redis未命中,查询数据库(从库,如SELECT * FROM users WHERE username = ?),获取用户信息并生成Token(如JWT),将Token缓存到Redis(TTL=30分钟),返回Token给客户端。
  • 后续请求:客户端携带Token,服务验证Token(先查Redis,再查数据库),若有效则返回用户信息,否则返回错误。

5) 【面试口播版答案】:
“面试官您好,针对百万级并发用户认证系统,核心设计思路是无状态分布式架构,结合负载均衡、多级缓存、数据库读写分离。首先,负载均衡用Nginx分发请求到多个认证服务实例,保证高可用。服务本身是无状态的,这样每个实例可以独立处理请求,便于水平扩展。缓存方面,进程内缓存(LRU)用于高频访问的用户信息,Redis作为分布式缓存存储用户Token和Session,减少数据库压力。数据库采用MySQL读写分离,主库处理认证记录写入,从库处理用户信息读取,提高读性能。认证流程中,用户登录后,服务生成Token并缓存到Redis(TTL设为30分钟),客户端后续请求携带Token,服务验证Token(先查Redis,再查数据库),确保响应时间低于100ms。这样设计能支持百万级并发,响应快,且高可用和可扩展。”

6) 【追问清单】:

  • 问题1:如何处理Token过期或失效?
    回答要点:通过Redis的TTL自动过期,或客户端主动刷新Token(服务端验证后重新生成并缓存)。
  • 问题2:数据库分片或主从同步延迟如何解决?
    回答要点:主从同步采用异步复制,设置合理延迟阈值;从库数量足够,减少读延迟影响。
  • 问题3:如何保证缓存一致性和数据一致性?
    回答要点:缓存预热(初始化时加载常用数据),结合数据库事务和缓存失效机制(如写时失效,读时未命中则从数据库加载并更新缓存)。
  • 问题4:服务如何实现无状态?
    回答要点:不存储用户会话状态,所有用户数据从缓存或数据库获取,每个实例独立处理请求,不依赖其他实例状态。
  • 问题5:高并发下如何处理缓存击穿或雪崩?
    回答要点:缓存击穿用互斥锁或分布式锁,缓存雪崩用随机过期时间或热点数据预加载。

7) 【常见坑/雷区】:

  • 忽略无状态设计:导致水平扩展困难,实例间状态不一致。
  • 缓存策略不当:仅依赖数据库,导致响应延迟;或缓存未分层,影响性能。
  • 数据库未做读写分离:读压力过大,主库性能瓶颈。
  • 负载均衡配置不当:健康检查不完善,故障实例影响整体可用性。
  • Token验证时只查缓存:未考虑缓存失效导致的安全问题(如缓存穿透)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1