题目重点:多帖 Onsite SD 指向群聊, 提 data schema、多 WebSocket 路由、容灾与 Top N group chat 优化。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版支持创建群、成员进退、发送/拉取消息、离线补收;每群内按 server-assigned sequence 有序,不要求全局顺序。
- Top N 训练示例按用户最近活跃群排序;真实题若按未读数/成员数,索引与读模型需替换,不能宣称原题如此。
- 消息内容安全/保留策略与身份权限具体规则需面试现场确认。
解题路线
- 数据模型拆 Group、Membership(userId,groupId,role,lastReadSeq)、Message(groupId,seq,senderId,body,createdAt)、Delivery/Connection;成员关系校验独立于 WebSocket 长连接状态。
- 发送时验证 membership,按 groupId 分片/序列化写消息并分配递增 seq,持久化后异步 fanout 给在线成员;客户端用 (groupId,seq) 去重。
- 多台 WebSocket 网关在共享 presence 路由表记录 userId→连接节点,网关失效后客户端重连并按 lastAckSeq 补取;离线用户通过 inbox/拉取恢复。
- 大群 fanout 与小群不同:可对高成员数群采用写一次+在线订阅拉取/混合推送,防单消息写放大;Top N 聚合维护用户/群维度读模型并设置稳定 tie-break/时间窗口。
- 监控发送持久化成功率、端到端送达时延、重复/漏消息、网关重连、群分区热点与 Top N 滞后。
手动走一遍
训练例:G 的 seq=41 已由用户收到,网关断线后重连到另一台,从 lastAckSeq=41 拉 42 起消息;重复推送 42 时按 (G,42) 去重。若用户被移出群,恢复拉取前重新核 Membership,不因持有旧连接而继续访问。
规模与取舍
单消息存储 O(1) 主写,直接推送成本 O(在线成员数);历史分页按 (groupId,seq) 索引 O(log M+P)。Top N 更新和查询取指标定义与活跃群数,题目没有规模。
易错点与追问
容易失分的边界
- 用 WebSocket 连接状态当群成员权限。
- 只有网关内存消息,故障后丢历史。
- 跨网关没有用户路由/补收协议。
- 群内无序号导致重连后去重困难。
- Top N 指标未澄清就设计排序。
继续深挖
- Top N 若按未读数怎样更新?
- 十万人大群如何降低 fanout?
- 成员退出后历史可见范围如何定?
- 消息编辑/撤回如何保持顺序?
