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

设计一个支持百万级用户的高并发用户认证系统,需要考虑性能、安全、可扩展性,请描述系统架构、关键技术选型以及如何保证高可用性。

微软Software Engineer Intern难度:中等

答案

1) 【一句话结论】
设计百万级高并发认证系统,核心是构建分布式认证中心,通过JWT令牌(签名用RS256提升安全性)、Redis集群缓存(RDB/AOF持久化保障一致性)、Kafka消息队列(ACK=all确保消息不丢失)、分布式锁(SETNX+10秒超时避免死锁)和数据库分库分表(用户ID哈希分片+缓存预热解决热点),保障性能、安全与高可用。

2) 【原理/概念讲解】

  • 认证服务:用户密码用bcrypt加密存储(防止明文泄露),验证通过生成JWT(包含用户ID、过期时间、签名,签名采用RS256非对称加密,安全性更高)。
  • 令牌服务:Redis集群缓存有效令牌,集群通过RDB(快照持久化)和AOF(日志持久化)保证数据一致性,避免高并发下缓存不一致。
  • 负载均衡器:Nginx分发请求到多实例,采用IP哈希或轮询策略,避免单点压力。
  • 消息队列:Kafka处理异步任务(如登录日志、用户状态变更),通过ACK=all机制(生产者发送消息后需等待所有副本确认,未确认则重试),确保消息持久化。
  • 分布式锁:Redis SETNX原子操作实现互斥,设置10秒超时(防止死锁),用于热点数据查询(如空令牌查询)。
  • 数据库分库分表:用户ID哈希分库可能导致热点,解决方案是调整分片键(如用户ID+时间)或冷启动时预加载热点数据(缓存预热),提升读写性能。

3) 【对比与适用场景】

方案定义特性使用场景注意点
Redis集群分布式Key-Value存储,支持RDB/AOF持久化高速读写(毫秒级),数据一致性保障认证令牌缓存、会话管理、热点数据缓存内存分配需合理,持久化可能影响性能
Kafka分布式消息队列,支持高吞吐、持久化异步任务处理,可靠性保障(ACK=all)登录日志、用户状态变更、异步通知需配置ACK=all,避免数据丢失
分布式锁(Redis SETNX)通过SETNX原子操作实现互斥线程安全,避免缓存击穿热点数据查询(如空令牌查询)锁超时设置(如10秒),防止死锁
数据库分库分表按用户ID哈希分库,按月分表扩展性提升,读写分离用户数据存储用户ID哈希分片可能导致热点,需调整分片键或缓存预热

4) 【示例】
令牌刷新流程(伪代码):

  • 客户端在短效令牌(15分钟)过期前,发送POST请求到刷新接口:
    POST /auth/refresh
    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...  # 原令牌
    
  • 认证中心验证原令牌有效后,生成新的长效令牌(1小时),并更新Redis缓存:
    {
      "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_type": "Bearer",
      "expires_in": 3600
    }
    
  • 客户端存储新令牌,后续请求携带新令牌。

5) 【面试口播版答案】
设计百万级高并发认证系统,核心是构建分布式认证中心。首先,认证服务负责用户身份验证,密码用bcrypt加密存储,验证通过生成JWT令牌(签名采用RS256提升安全性)。然后,令牌通过Redis集群缓存,集群通过RDB/AOF持久化保证数据一致性,避免高并发下缓存不一致。负载均衡器分发请求到多实例,提升吞吐量。消息队列处理异步任务(如登录日志),通过Kafka的ACK=all机制确保不丢失。对于令牌过期,采用短效(15分钟)和长效(1小时)令牌,客户端在短效令牌过期前刷新,生成新令牌。缓存击穿时,使用Redis SETNX分布式锁,只允许一个线程查询数据库,其他线程等待,然后设置缓存。数据库分库分表,按用户ID哈希分库可能导致热点,解决方案是调整分片键(如用户ID+时间)或增加缓存预热(如冷启动时预加载热点数据),确保高可用。

6) 【追问清单】

  • 问题1:如何处理令牌泄露?
    回答:令牌绑定设备ID,不同设备使用不同令牌,或通过设备指纹、IP白名单限制。
  • 问题2:缓存雪崩的应对?
    回答:设置缓存过期时间(如1小时),并随机化过期时间,避免集中过期。
  • 问题3:消息队列的消费者失败处理?
    回答:重试机制(如指数退避),或死信队列处理无法消费的消息。
  • 问题4:令牌签名算法选择?
    回答:推荐RS256(非对称加密,安全性更高),HS256(对称加密,性能更高,适合内部系统)。
  • 问题5:数据库分库分片热点问题?
    回答:调整分片键(如用户ID+时间)或增加缓存预热(如冷启动时预加载热点数据)。

7) 【常见坑/雷区】

  • 坑1:密码未加密存储,直接存储明文,导致安全漏洞。
  • 坑2:令牌不设置过期时间,长期有效,被滥用。
  • 坑3:缓存未处理空值(击穿/雪崩),导致数据库压力激增。
  • 坑4:消息队列未ACK机制,导致异步任务数据丢失。
  • 坑5:数据库未分库分表,高并发下性能下降,甚至崩溃。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1