题目重点:把注册认证和聊天投递分层设计,讨论凭证保护、会话连接、幂等、消息顺序及跨区域恢复。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版为注册用户之间的 1:1 文本聊天;不预设端到端加密、群聊或合规保留期限。
- 每位用户有归属区域但可异地登录;以会话内序列保证可解释顺序,不承诺全球所有聊天消息形成单一总序。
解题路线
- 注册链路:校验邮箱/手机号所有权、防撞库限流、密码只存抗离线猜测的带盐密码哈希,验证与重置令牌短期且一次性;会话令牌生命周期、设备撤销与审计分离。不要存原始密码或把密码写日志。
- 聊天链路:客户端提交带 client_message_id 的消息,服务端认证用户和会话权限,持久记录并分配会话序号后确认;重复提交返回同消息。在线接收方可经 WebSocket 推送,离线方用游标补拉。
- 多区域要明确写入归属与故障切换:每会话主写区或一致的分片归属减少并发序号冲突;异步跨区复制有 RPO,故障切换可能重播/漏确认,客户端幂等 ID 和游标用于恢复。
- 容量按连接数、消息 QPS、平均大小、保留时间和跨区流量分解;对消息队列积压、投递延迟、重复率、登录失败率和滥用行为监控。
- 隐私边界先确认:传输加密、服务端访问控制、附件扫描及删除/保留规则。若要求端到端加密,服务端内容搜索/审核与密钥恢复设计会根本改变。
手动走一遍
客户端发送 M1,服务端已持久但 ACK 丢失,客户端同 client_message_id 重试。服务端查询既有记录并返原会话序号;另一设备从上次游标补拉,只看到一条 M1。区域故障后先确认归属与复制进度再接管写入。
规模与取舍
活跃连接数 C 与消息写入速率 Q 决定连接网关和存储分片;按用户/会话增长保存历史消息,跨区复制约增加与写入字节量同阶的网络成本。题目未明确规模,不能给固定机器数。
易错点与追问
容易失分的边界
- 明文保存密码或用可逆加密代替密码哈希。
- 只用 WebSocket 推送而不落持久消息/离线游标。
- 网络 ACK 丢失后重试生成重复消息。
- 把跨区异步复制说成零丢失强一致。
- 未先确认端到端加密要求,就承诺服务端全文搜索。
继续深挖
- 若加入群聊,会话顺序和 fan-out 怎么改?
- 跨区切换后如何处理已确认却未复制的消息?
- 端到端加密下搜索和多设备密钥如何设计?
- 被盗账号如何撤销全部设备会话?
