SWE / IC5 · Onsite System Design

Coinbase Explore 实时价格:多源接入、最新值与 WebSocket 推送

多篇 SD 面经指向 Explore 页面;IC5 追问多个 external source、用户与数据规模、后端实时接入及客户端推送。

题目重点:多篇 SD 面经指向 Explore 页面;IC5 追问多个 external source、用户与数据规模、后端实时接入及客户端推送。

题意与假设

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

  • 训练版以 symbol 与 quoteCurrency 识别一个价格,外部 feed 每条带 source、sourceSequence、eventTime、price;若源不带序号,只能用接收时间和重连快照做弱顺序保证。
  • 展示价是按既定来源优先级或可解释聚合规则选出的最新有效值,不把不同交易所价格天然当一个无歧义真值。
  • 训练 SLO、资产数量和订阅用户数都先向面试官确认,再代入容量估算;题目无具体数值。

解题路线

  1. 接入层保持到外部来源的 WebSocket 连接,按 source/symbol 分区解码、校验和标准化;重连时拉快照或 replay,拒绝旧 sequence/时间戳覆盖新数据。
  2. 聚合层维护每个 symbol 的来源报价、最后更新时间和质量状态;选择最优来源或计算展示聚合价时公开规则与异常值处理。超过 freshness 阈值标记 stale,不能继续无提示展示旧价。
  3. 内部分区流按 symbol 保序,热 symbol 可分发到缓存/扇出层;客户端订阅 WebSocket/SSE,发送初始快照+后续递增序号。断线重连可凭 lastSequence 补增量,缺口过大则重拉快照。
  4. 慢客户端用有界缓冲和价格更新合并(最新值覆盖旧待发值),明确不会无限积压;成交/交易事件不能简单合并,和展示报价语义不同。
  5. 容量估算分别看外部 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 分钟后如何恢复?
✓已复制微信号!