题目重点:多篇 SD 面经指向 Explore 页面;IC5 追问多个 external source、用户与数据规模、后端实时接入及客户端推送。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版以 symbol 与 quoteCurrency 识别一个价格,外部 feed 每条带 source、sourceSequence、eventTime、price;若源不带序号,只能用接收时间和重连快照做弱顺序保证。
- 展示价是按既定来源优先级或可解释聚合规则选出的最新有效值,不把不同交易所价格天然当一个无歧义真值。
- 训练 SLO、资产数量和订阅用户数都先向面试官确认,再代入容量估算;题目无具体数值。
解题路线
- 接入层保持到外部来源的 WebSocket 连接,按 source/symbol 分区解码、校验和标准化;重连时拉快照或 replay,拒绝旧 sequence/时间戳覆盖新数据。
- 聚合层维护每个 symbol 的来源报价、最后更新时间和质量状态;选择最优来源或计算展示聚合价时公开规则与异常值处理。超过 freshness 阈值标记 stale,不能继续无提示展示旧价。
- 内部分区流按 symbol 保序,热 symbol 可分发到缓存/扇出层;客户端订阅 WebSocket/SSE,发送初始快照+后续递增序号。断线重连可凭 lastSequence 补增量,缺口过大则重拉快照。
- 慢客户端用有界缓冲和价格更新合并(最新值覆盖旧待发值),明确不会无限积压;成交/交易事件不能简单合并,和展示报价语义不同。
- 容量估算分别看外部 feed 更新率、每 symbol 订阅者数、扇出消息/秒、连接数和跨地域网络成本;高并发可用 edge fanout,但外部源故障需有降级/备用源与陈旧标记。
手动走一遍
训练例:BTC/USD 的来源 A 发 seq101 价格 100,随后 seq102 价格 101;网络重放 seq101 时拒绝回退。来源 A 中断超过 freshness 阈值,若 B 仍有效则按配置切 B 并标注来源;两源都过期就展示 stale,而非继续声称‘最新’。
规模与取舍
S 个 asset/source 报价占 O(S) 热状态;更新处理约 O(1) 或 O(log S) 聚合,扇出成本与该 symbol 的订阅连接数线性相关。具体 QPS/延迟由外部更新率与用户数决定,题目无数字。
易错点与追问
容易失分的边界
- 把多来源价格默认相同,未定义冲突和优先级。
- 旧消息重放覆盖新价格。
- 只设计后端采集,不说明客户端首次快照、增量与重连。
- 慢客户端积压每个 tick 导致内存失控。
- 展示 stale 报价却没有时间/状态提示。
继续深挖
- 外部来源序号不连续时怎样补缺?
- 一个热门 asset 有百万订阅如何扇出?
- 来源价格差异大如何选展示价?
- 客户端离线 5 分钟后如何恢复?
