Senior SWE · Onsite System Design

Apple 聊天应用与用户注册:安全、消息顺序和跨区域故障

把注册认证和聊天投递分层设计,讨论凭证保护、会话连接、幂等、消息顺序及跨区域恢复。

题目重点:把注册认证和聊天投递分层设计,讨论凭证保护、会话连接、幂等、消息顺序及跨区域恢复。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版为注册用户之间的 1:1 文本聊天;不预设端到端加密、群聊或合规保留期限。
  • 每位用户有归属区域但可异地登录;以会话内序列保证可解释顺序,不承诺全球所有聊天消息形成单一总序。

解题路线

  1. 注册链路:校验邮箱/手机号所有权、防撞库限流、密码只存抗离线猜测的带盐密码哈希,验证与重置令牌短期且一次性;会话令牌生命周期、设备撤销与审计分离。不要存原始密码或把密码写日志。
  2. 聊天链路:客户端提交带 client_message_id 的消息,服务端认证用户和会话权限,持久记录并分配会话序号后确认;重复提交返回同消息。在线接收方可经 WebSocket 推送,离线方用游标补拉。
  3. 多区域要明确写入归属与故障切换:每会话主写区或一致的分片归属减少并发序号冲突;异步跨区复制有 RPO,故障切换可能重播/漏确认,客户端幂等 ID 和游标用于恢复。
  4. 容量按连接数、消息 QPS、平均大小、保留时间和跨区流量分解;对消息队列积压、投递延迟、重复率、登录失败率和滥用行为监控。
  5. 隐私边界先确认:传输加密、服务端访问控制、附件扫描及删除/保留规则。若要求端到端加密,服务端内容搜索/审核与密钥恢复设计会根本改变。

手动走一遍

客户端发送 M1,服务端已持久但 ACK 丢失,客户端同 client_message_id 重试。服务端查询既有记录并返原会话序号;另一设备从上次游标补拉,只看到一条 M1。区域故障后先确认归属与复制进度再接管写入。

规模与取舍

活跃连接数 C 与消息写入速率 Q 决定连接网关和存储分片;按用户/会话增长保存历史消息,跨区复制约增加与写入字节量同阶的网络成本。题目未明确规模,不能给固定机器数。

易错点与追问

容易失分的边界

  • 明文保存密码或用可逆加密代替密码哈希。
  • 只用 WebSocket 推送而不落持久消息/离线游标。
  • 网络 ACK 丢失后重试生成重复消息。
  • 把跨区异步复制说成零丢失强一致。
  • 未先确认端到端加密要求,就承诺服务端全文搜索。

继续深挖

  • 若加入群聊,会话顺序和 fan-out 怎么改?
  • 跨区切换后如何处理已确认却未复制的消息?
  • 端到端加密下搜索和多设备密钥如何设计?
  • 被盗账号如何撤销全部设备会话?
✓已复制微信号!