
1) 【一句话结论】
采用分布式负载均衡+多级缓存(Redis集群)+异步解耦(Kafka)+安全增强(JWT+加盐哈希+CSRF+XSS防护)的架构,通过水平扩展和缓存优化,支撑百万级并发登录,同时保障系统安全与性能。
2) 【原理/概念讲解】
老师:设计百万级并发登录系统,核心是解决高并发下的性能、可用性和安全性。首先,负载均衡层:前端请求通过Nginx(配置健康检查、会话保持)分发到多个登录服务实例,实现水平扩展,避免单点压力。缓存层:使用Redis集群存储用户登录令牌(分布式会话),减少数据库查询,相当于“高速缓存仓库”,同时通过互斥锁(如Redis SETNX)+空值缓存解决缓存击穿,随机过期时间(300-600秒随机)解决雪崩。异步解耦层:登录成功后,业务逻辑(如发送验证码、更新用户状态)通过Kafka异步处理,解耦核心流程,提升响应速度。安全层:采用JWT(签名算法HS256,包含用户ID、过期时间)+加盐哈希存储密码,生成CSRF令牌并验证,对用户输入进行HTML转义,防止XSS攻击。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis | 内存数据库,支持数据结构、持久化、事务 | 高速读写、支持集群、数据结构丰富(如列表、集合) | 登录状态、会话、热点数据缓存 | 需集群部署,注意内存管理,持久化配置(RDB/AOF) |
| Memcached | 基于内存的键值缓存 | 简单存储、无持久化、低延迟 | 热点数据临时缓存(如商品列表) | 适合轻量级场景,无持久化,数据丢失风险 |
| Nginx | 反向代理+负载均衡 | 高性能、灵活配置(轮询、权重、健康检查) | Web层负载均衡 | 需配置健康检查(如检查服务端口响应),剔除故障节点 |
| LVS | 四层/七层负载均衡 | 适合大规模,高吞吐 | 大型系统负载均衡 | 配置复杂,需内核支持 |
4) 【示例】
登录请求处理伪代码(Java风格):
public String login(String username, String password) {
// 1. 负载均衡分发(Nginx已处理)
// 2. 验证密码(数据库查询+加盐哈希比较)
if (validatePassword(username, password)) {
// 3. 生成JWT令牌(HS256签名,包含用户ID、过期时间)
String token = generateJwt(username, System.currentTimeMillis() + EXPIRE_TIME);
// 4. 存储到Redis集群(分布式令牌,key: token, value: 用户信息JSON+过期时间)
redis.setex(token, EXPIRE_TIME, userJson);
return token;
}
return "invalid";
}
Redis缓存击穿处理(空值缓存):
# 缓存用户信息(key: user:1001, value: 用户JSON, 过期时间5分钟)
SET "user:1001" "user_id:1001,username:张三" EX 300
# 缓存令牌(key: token:abc123, value: 用户信息, 过期时间1小时)
SET "token:abc123" "user_id:1001,exp:1672531200" EX 3600
分布式令牌唯一性生成(Redis incr):
# 原子自增生成唯一token
SET "login:token:counter" 0
INCR "login:token:counter"
String token = "token:" + getCounter();
5) 【面试口播版答案】
面试官您好,针对百万级并发登录系统,我的设计核心是构建分布式架构,通过负载均衡、多级缓存、异步解耦和安全增强来支撑高并发。首先,前端请求通过Nginx负载均衡分发到多个登录服务实例,实现水平扩展。用户登录信息先存入Redis集群作为分布式会话,减少数据库压力。登录成功后,生成JWT令牌并缓存到Redis,客户端携带令牌后续请求。同时,登录后的业务逻辑(如发送验证码、更新用户状态)通过Kafka异步处理,解耦流程。安全方面,采用JWT(签名算法HS256)+加盐哈希存储密码,加入CSRF防护,并对用户输入进行HTML转义,防止XSS攻击。这样既能应对百万并发,又保证安全性和性能。
6) 【追问清单】
7) 【常见坑/雷区】