返回 Web3 笔记
Day 119

Day 119:系统设计限时练习 — 跨链聚合器 + 清算监控

两道系统设计限时练习:①45分钟设计跨链DEX聚合器 ②45分钟设计实时清算监控系统,含完整架构图、组件设计、trade-off分析

2026-05-06
交易系统设计面试跨链聚合器清算监控限时练习Day119

核心概念

系统设计面试的重要性

一句话定义:系统设计面试考察的是将模糊需求转化为可实施的技术方案的能力,包括需求分析、架构选型、组件设计、Trade-off 分析和失败场景处理。

类比理解:系统设计面试就像考建筑师——不是让你砌砖(写代码),而是让你设计大楼的整体结构、选择建材、规划管道电路、评估抗震能力。45 分钟内完成从蓝图到验证的全过程。

系统设计面试评分维度

维度权重考察内容
需求分析15%能否从模糊需求中提出关键问题
规模估算10%能否做合理的量化估算
高层架构25%整体方案是否合理、可扩展
核心组件25%关键模块的详细设计
Trade-off15%对方案的取舍分析是否深入
扩展与容错10%失败场景和扩展方案

练习一:跨链 DEX 聚合器(45 分钟)

Step 1:需求分析(5 分钟)

面试官问题:设计一个跨链 DEX 聚合器

关键问题(向面试官确认):
├── Q1:支持多少条链?
│   └── 假设:10+ 条链(Ethereum、Arbitrum、Optimism、
│       Base、Polygon、BSC、Avalanche、Solana 等)
├── Q2:支持多少个底层 DEX?
│   └── 假设:每条链 2-5 个,总计 20+ 个 DEX
├── Q3:是否支持跨链 Swap?
│   └── 是(用户输入 Chain A Token X → 输出 Chain B Token Y)
├── Q4:性能要求?
│   └── 报价 < 3 秒,执行确认 < 跨链桥时间 + 30 秒
└── Q5:用户规模?
    └── DAU 50K,峰值 QPS ~50

功能需求(FR):
├── FR1:单链聚合(同链多 DEX 最优路由)
├── FR2:跨链聚合(跨链桥 + DEX 组合最优路径)
├── FR3:报价对比(展示多条路径及预估费用)
├── FR4:交易执行与状态追踪
└── FR5:MEV 保护(可选)

非功能需求(NFR):
├── NFR1:报价延迟 < 3 秒
├── NFR2:价格准确度 > 99%(实际执行 vs 报价)
├── NFR3:可用性 > 99.9%
├── NFR4:支持 10+ 链和 20+ DEX
└── NFR5:可扩展(新增链/DEX 应在 1 天内完成)

Step 2:规模估算(3 分钟)

规模估算:
═══════════════════════════════════════

用户量:
├── DAU:50,000
├── 人均请求报价:10 次/天
├── 人均执行交易:1-2 次/天
├── 总报价请求:500,000 / 天
├── 总交易执行:75,000 / 天
└── 峰值 QPS:~50(报价),~5(执行)

数据量:
├── 价格数据:10 链 × 1000 交易对 × 每 500ms 更新
│   = 20,000 次更新/秒
├── 交易记录:75,000 / 天 × 5KB = 375 MB/天
├── 历史报价:500,000 / 天 × 2KB = 1 GB/天
└── 总存储增长:~1.5 GB/天 ≈ 45 GB/月

基础设施需求(粗略):
├── 计算:中等(CPU 密集在路由算法)
├── 内存:高(价格缓存需要大量 RAM)
├── 网络:中等(与多链 RPC 通信)
└── 存储:中低(大部分是缓存数据)

Step 3:高层架构(10 分钟)

跨链 DEX 聚合器高层架构:
═══════════════════════════════════════

┌─────────────────────────────────────────────┐
│                  用户前端                     │
│  (React/Next.js, WalletConnect)              │
└──────────────────┬──────────────────────────┘
                   │ HTTPS / WebSocket
                   ▼
┌─────────────────────────────────────────────┐
│              API Gateway                     │
│  (Rate Limit / Auth / Load Balance)          │
└──────┬───────┬────────┬──────────┬──────────┘
       │       │        │          │
       ▼       ▼        ▼          ▼
┌──────────┐ ┌────────┐ ┌────────┐ ┌──────────┐
│ 报价服务  │ │路由引擎│ │执行服务│ │ 状态追踪  │
│ (Quote)  │ │(Route) │ │(Exec)  │ │(Tracker) │
└────┬─────┘ └───┬────┘ └───┬────┘ └────┬─────┘
     │           │          │            │
     ▼           ▼          ▼            ▼
┌─────────────────────────────────────────────┐
│             价格数据层                        │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐    │
│  │ 价格缓存  │ │ 流动性池  │ │ Gas 预估  │    │
│  │ (Redis)  │ │ (Redis)  │ │ (Redis)  │    │
│  └──────────┘ └──────────┘ └──────────┘    │
└──────────────────┬──────────────────────────┘
                   │
                   ▼
┌─────────────────────────────────────────────┐
│          链上数据采集层                       │
│  ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐       │
│  │ETH │ │ARB │ │OP  │ │BASE│ │SOL │  ...   │
│  └────┘ └────┘ └────┘ └────┘ └────┘       │
│  (RPC Nodes / WebSocket Subscriptions)      │
└─────────────────────────────────────────────┘

跨链执行路径:

用户请求:ETH(Ethereum) → USDC(Arbitrum)

路径 1:ETH→WETH→USDC(Eth)→Bridge→USDC(Arb)
路径 2:ETH→Bridge→ETH(Arb)→USDC(Arb)
路径 3:ETH→WETH→Bridge(Stargate)→USDC(Arb)

路由引擎比较所有路径的:
├── 最终获得的 USDC 数量
├── Gas 费用(包含桥费用)
├── 预计完成时间
├── 滑点风险
└── 推荐最优路径

Step 4:核心组件设计(15 分钟)

组件 1:价格缓存系统

价格缓存设计:
═══════════════════════════════════════

数据结构(Redis):
├── Key: price:{chain}:{dex}:{tokenA}:{tokenB}
├── Value: { price, liquidity, timestamp, block }
├── TTL: 500ms(高频更新)
└── 更新频率:每 500ms 从链上拉取

更新策略:
├── 主动推送:WebSocket 订阅链上事件
│   └── 监听 Swap/Sync 事件实时更新
├── 定期拉取:每 500ms 查询 RPC
│   └── 作为推送的备份和校验
└── 惰性更新:用户请求时检查时效
    └── 如缓存 > 1s 则触发即时更新

缓存层次:
L1: 本地内存(进程内,<1ms,存最热门交易对)
L2: Redis 集群(<5ms,存所有活跃交易对)
L3: 链上查询(<500ms,缓存未命中时回源)

组件 2:路由算法引擎

路由算法设计:
═══════════════════════════════════════

问题建模:
├── 将所有链、DEX、Token 建模为有向加权图
├── 节点 = Token(带链标识)
├── 边 = 交易路径(DEX swap 或 Bridge)
├── 权重 = 预期滑点 + Gas + 桥费 + 时间成本
└── 目标:找到权重最小的路径

图示例:
                        ┌──────────┐
              Uniswap   │ETH(Eth)  │  Stargate
            ┌──────────▶│ WETH     │──────────┐
            │           └──────────┘          │
    ┌───────┴──┐                         ┌────▼─────┐
    │ETH(Eth)  │        Arbitrum Bridge  │USDC(Arb) │
    │          │──────────────────────▶  │          │
    └───────┬──┘                         └────▲─────┘
            │           ┌──────────┐          │
            └──────────▶│USDC(Eth) │──────────┘
              Uniswap   │          │  Hop Bridge
                        └──────────┘

算法:改进的 Dijkstra

核心改进点:
├── 1. 滑点感知:大额订单需要考虑流动性深度
│   └── 拆分到多条路径(Split Routing)
├── 2. Gas 感知:不同链 Gas 成本差异巨大
│   └── Ethereum: $5-20 vs Arbitrum: $0.01-0.10
├── 3. 时间感知:桥的延迟从 1 分钟到 30 分钟
│   └── 用户可选"最快"或"最便宜"
└── 4. 并发评估:同时计算 Top-K 条路径

拆单策略(Split Routing):
├── 大额订单可能在单个 DEX 滑点过大
├── 将订单拆分到多个 DEX/路径
├── 优化目标:最小化总滑点 + Gas
├── 示例:$100K USDC→ETH
│   ├── 60% → Uniswap V3(流动性最深)
│   ├── 30% → Curve(稳定币路径好)
│   └── 10% → SushiSwap(补充流动性)
└── 算法:凸优化 / 贪心分配

组件 3:Solver 竞拍系统

Solver 荷兰拍卖设计(Intent-Based):
═══════════════════════════════════════

流程:
1. 用户提交 Intent:"我要用 1 ETH 换尽量多的 USDC"
2. 系统广播 Intent 到 Solver 网络
3. Solver 竞价(荷兰拍卖 / 密封报价)
4. 最优 Solver 执行交易
5. 用户获得最优价格

荷兰拍卖时间线:
    价格
    │
    │ ████
    │ ████████
    │ ████████████
    │ ████████████████  ← 起始报价(最优价)
    │    ████████████████████
    │        ████████████████████
    │            ████████████████████  ← 当前价
    │                ████████████████████
    │                    ███████████████████
    │                        ████████████████  ← 成交价
    └───────────────────────────────────────── 时间
    0s                  3s              5s

Solver 激励:
├── 执行奖励:用户支付的服务费(0.01-0.05%)
├── MEV 捕获:Solver 可内化 MEV
├── 声誉积分:执行率高的 Solver 优先接单
└── Slash 机制:未执行的 Solver 扣押保证金

优于传统路由的地方:
├── Solver 有私有流动性(做市库存)
├── 可以批量匹配(Order-Flow Auction)
├── MEV 被 Solver 捕获并部分返还用户
└── 用户体验更简单(只需声明意图)

组件 4:交易状态机

跨链交易状态机:
═══════════════════════════════════════

                    ┌──────────┐
                    │  CREATED │
                    └────┬─────┘
                         │ 用户签名
                    ┌────▼─────┐
                    │ SIGNED   │
                    └────┬─────┘
                         │ 提交到源链
                    ┌────▼─────┐
          ┌─────── │ PENDING  │ ──────┐
          │        └────┬─────┘       │
          │ 超时        │ 源链确认     │ 失败
          │        ┌────▼─────┐       │
          │        │ SRC_DONE │       │
          │        └────┬─────┘       │
          │             │ 桥开始      │
          │        ┌────▼─────┐       │
          │        │ BRIDGING │───────┤
          │        └────┬─────┘       │
          │             │ 桥完成      │
          │        ┌────▼─────┐       │
          │        │ DST_SWAP │───────┤
          │        └────┬─────┘       │
          │             │ 目标链完成   │
          │        ┌────▼─────┐  ┌────▼─────┐
          │        │ COMPLETED│  │  FAILED  │
          │        └──────────┘  └────┬─────┘
          │                           │
          └───────────────────────────┘
                                 需要退款/重试

关键设计:
├── 每个状态转换都有超时机制
├── FAILED 状态需要自动/手动退款
├── 所有状态变更记录审计日志
├── 前端轮询/WebSocket 推送状态
└── 桥延迟期间显示预估时间

Step 5:Trade-off 分析(7 分钟)

关键 Trade-off:
═══════════════════════════════════════

Trade-off 1:自建路由 vs Solver 网络
┌──────────────┬────────────────┬────────────────┐
│              │ 自建路由引擎    │ Solver 网络     │
├──────────────┼────────────────┼────────────────┤
│ 延迟         │ 快(<1s)      │ 稍慢(2-5s)   │
│ 价格优化     │ 有限(公开池)  │ 更优(私有流动性)│
│ MEV 保护     │ 需额外方案     │ 内置            │
│ 开发复杂度   │ 高             │ 中              │
│ 可扩展性     │ 每加链需开发    │ Solver 自动扩展 │
│ 可靠性       │ 自控           │ 依赖 Solver     │
└──────────────┴────────────────┴────────────────┘
推荐:混合方案——简单路由自建,复杂跨链用 Solver

Trade-off 2:价格精度 vs 响应速度
├── 高精度:查询所有 DEX 实时价格 → 慢(3-5s)
├── 高速度:使用缓存价格 → 可能有偏差
└── 推荐:先返回缓存报价,后台刷新后更新

Trade-off 3:去中心化 vs 用户体验
├── 完全链上:透明但慢、贵
├── 链下撮合+链上结算:快但有信任假设
└── 推荐:链下报价和路由,链上执行和结算

失败场景处理:
├── 桥故障:自动选择备用桥或退款
├── 价格偏差 >1%:警告用户重新报价
├── Solver 不执行:保证金扣押 + 自动路由执行
├── 链拥堵:动态调整 Gas + 提示用户等待
└── 部分执行:确保原子性或自动退款

MEV 保护方案:
├── 1. Private Mempool(Flashbots Protect)
├── 2. Solver 内化 MEV 后返还
├── 3. 限价单(用户设置最低接受价格)
├── 4. 批量拍卖(CoW Protocol 方式)
└── 推荐:默认使用 Private Mempool + 限价保护

Step 6:面试总结陈述(5 分钟)

总结框架:

1. 核心设计选择
├── 混合架构:简单路由自建 + 跨链用 Solver
├── 多层缓存:L1 内存 + L2 Redis + L3 链上
├── Intent-Based:用户只需声明意图
└── 状态机:跨链交易全生命周期管理

2. 扩展方向
├── 新增链:插件化适配器,1 天内接入
├── 新增 DEX:配置化接入,无需改代码
├── 性能扩展:报价服务水平扩展
└── AI 增强:用历史数据预测最优路由

3. 监控指标
├── 报价响应时间 P99 < 3s
├── 报价 vs 实际执行偏差 < 0.5%
├── 跨链交易成功率 > 99%
└── 用户满意度(执行价格排名)

练习二:实时清算监控系统(45 分钟)

Step 1:需求分析(5 分钟)

面试官问题:设计一个实时清算监控系统

关键问题确认:
├── Q1:监控哪些协议?
│   └── 5+ Perp DEX(Hyperliquid、dYdX、GMX、Drift、Vertex)
├── Q2:监控哪些指标?
│   └── 清算事件、清算金额、清算模式、大额清算告警
├── Q3:延迟要求?
│   └── 清算事件发生后 < 5 秒内展示
├── Q4:用户是谁?
│   └── 交易者、风控团队、研究分析师
└── Q5:告警需求?
    └── 大额清算、连锁清算、异常清算模式

功能需求:
├── FR1:实时采集 5+ Perp DEX 的清算事件
├── FR2:清算事件可视化 Dashboard
├── FR3:清算模式分类与统计
├── FR4:多级告警系统
├── FR5:历史清算数据查询与导出
└── FR6:预测性清算预警(扩展)

非功能需求:
├── NFR1:端到端延迟 < 5 秒
├── NFR2:数据不丢失(At-least-once)
├── NFR3:支持每秒 1000+ 清算事件(极端行情)
├── NFR4:历史数据保留 ≥ 1 年
└── NFR5:Dashboard 刷新频率 ≥ 1 秒

Step 2:规模估算(3 分钟)

规模估算:
═══════════════════════════════════════

清算事件量:
├── 正常日:5,000 - 10,000 事件/天
├── 波动日:10,000 - 50,000 事件/天
├── 极端日(如 2025.10 闪崩):100,000+ 事件/天
├── 平均 QPS:~1-5(正常),50-100(波动),500+(极端)
└── 设计峰值:1,000 QPS

单个清算事件数据:
├── 大小:~1 KB(含元数据)
├── 日存储:正常 10 MB,极端 100 MB
├── 年存储:~10 GB(压缩后 ~3 GB)
└── 存储成本很低

Dashboard 并发:
├── DAU:5,000(交易者+分析师)
├── 同时在线:~500
├── WebSocket 连接:500(推送更新)
└── 历史查询 QPS:~10

Step 3:高层架构(10 分钟)

实时清算监控系统高层架构:
═══════════════════════════════════════

数据采集层                消息队列        流处理层
┌──────────┐           ┌─────────┐    ┌──────────┐
│Hyperliquid│──────────▶│         │    │          │
│ Indexer   │           │         │    │ 清算分类  │
├──────────┤           │         │───▶│ 模式检测  │
│ dYdX     │──────────▶│  Kafka  │    │ 聚合统计  │
│ Indexer   │           │         │    │ 告警触发  │
├──────────┤           │         │    │          │
│ GMX      │──────────▶│         │    └────┬─────┘
│ Indexer   │           │         │         │
├──────────┤           │         │    ┌────▼─────┐
│ Drift    │──────────▶│         │    │  存储层   │
│ Indexer   │           │         │    ├──────────┤
├──────────┤           │         │    │TimescaleDB│
│ Vertex   │──────────▶│         │    │(时序数据) │
│ Indexer   │           └─────────┘    │          │
└──────────┘                          │Redis     │
                                      │(实时缓存)│
                                      │          │
                                      │ClickHouse│
                                      │(分析查询)│
                                      └────┬─────┘
                                           │
                                      ┌────▼─────┐
                                      │  API 层   │
                                      │ REST +    │
                                      │ WebSocket │
                                      └────┬─────┘
                                           │
                                      ┌────▼─────┐
                                      │Dashboard │
                                      │(React +  │
                                      │ D3.js)   │
                                      └──────────┘

数据流:
链上事件 → Indexer(自建) → Kafka → Stream Processor
  → TimescaleDB(持久化) + Redis(实时) → API → Dashboard

Step 4:核心组件设计(15 分钟)

组件 1:自建索引器

自建索引器设计:
═══════════════════════════════════════

为什么自建而非用第三方?
├── 延迟要求:第三方 API 通常 10-30s 延迟
├── 可靠性:不依赖第三方服务可用性
├── 定制化:可以精确提取需要的数据
└── 成本:高频查询第三方 API 费用高

每个协议的索引策略:

Hyperliquid(自有 L1):
├── WebSocket 订阅清算事件
├── 监听 Liquidation 类型的交易
├── 解析 clearinghouseState 数据
└── 延迟:< 1 秒

dYdX V4(Cosmos App-chain):
├── 订阅 Tendermint WebSocket
├── 过滤 Liquidation 类型的 Tx
├── 解析 SubaccountUpdate 事件
└── 延迟:< 2 秒

GMX V2(Arbitrum):
├── 订阅 Arbitrum 节点事件
├── 监听 PositionDecrease + LiquidationEvent
├── 解析事件日志
└── 延迟:< 3 秒

统一数据模型:
┌─────────────────────────────────────┐
│ LiquidationEvent {                  │
│   id: string (UUID)                 │
│   protocol: enum (HL/DYDX/GMX/...) │
│   chain: string                     │
│   timestamp: datetime               │
│   block_number: uint64              │
│   tx_hash: string                   │
│   trader: address                   │
│   market: string (BTC-USD/ETH-USD)  │
│   side: enum (LONG/SHORT)           │
│   size_usd: decimal                 │
│   collateral_usd: decimal           │
│   liquidation_price: decimal        │
│   mark_price: decimal               │
│   penalty_usd: decimal              │
│   liquidator: address (if any)      │
│   type: enum (详见清算分类)          │
│ }                                   │
└─────────────────────────────────────┘

组件 2:清算模式分类

清算事件四大分类:
═══════════════════════════════════════

类型 1:常规清算(Normal Liquidation)
├── 触发:保证金率 < 维持保证金率
├── 特征:单个仓位独立清算
├── 占比:~70% 的清算事件
└── 风险:低(系统正常运作)

类型 2:连锁清算(Cascade Liquidation)
├── 触发:大额清算 → 价格冲击 → 更多清算
├── 特征:短时间内(<5分钟)同方向大量清算
├── 识别规则:
│   └── 5 分钟内同市场同方向清算 > 20 笔
│       且总金额 > $10M
├── 占比:~15%
└── 风险:高(可能引发市场崩溃)

类型 3:猎杀清算(Hunting Liquidation)
├── 触发:价格被有意推向清算密集区
├── 特征:价格触及清算区后快速反弹
├── 识别规则:
│   └── 价格在 10 分钟内先跌 >3% 再涨 >2%
│       且清算集中在底部 1% 价格区间
├── 占比:~10%
└── 风险:中高(市场操纵行为)

类型 4:ADL 清算(Auto-Deleveraging)
├── 触发:保险基金耗尽时强制减仓盈利方
├── 特征:非自愿的仓位缩减
├── 识别规则:ADL 标记或保险基金余额骤降
├── 占比:~5%
└── 风险:极高(系统风险信号)

组件 3:告警规则引擎

三层告警规则:
═══════════════════════════════════════

Layer 1:简单规则(实时触发)
├── 大额清算:单笔 > $1M → P1 告警
├── 超大额清算:单笔 > $10M → P0 告警
├── 高频清算:同市场 1 分钟内 > 50 笔 → P1
└── ADL 触发:任何 ADL 事件 → P0

Layer 2:模式规则(滑动窗口)
├── 连锁清算:5 分钟窗口内同方向 > $10M → P0
├── 多市场联动:3+ 市场同时高频清算 → P0
├── 保险基金下降:30 分钟内下降 > 10% → P1
└── 清算猎杀模式:价格 V 型反转 + 集中清算 → P1

Layer 3:统计规则(历史对比)
├── 清算量异常:当前小时 > 30 天均值 5x → P1
├── 清算方向偏斜:多空比 > 9:1 → P1
└── 新市场异常:上线 <7 天的市场清算率 > 5% → P1

告警通知渠道:
├── P0(紧急):Telegram + PagerDuty + 短信
├── P1(重要):Telegram + Email
├── P2(关注):Dashboard 标注 + 日报
└── 所有告警写入日志和 Dashboard

组件 4:数据存储 — TimescaleDB 表设计

TimescaleDB 表设计(适合时序数据):

-- 清算事件表(Hypertable,按时间分区)
CREATE TABLE liquidation_events (
  id           UUID PRIMARY KEY,
  protocol     TEXT NOT NULL,
  chain        TEXT NOT NULL,
  timestamp    TIMESTAMPTZ NOT NULL,
  block_number BIGINT,
  tx_hash      TEXT,
  trader       TEXT,
  market       TEXT NOT NULL,
  side         TEXT NOT NULL,  -- LONG / SHORT
  size_usd     DECIMAL(20,2),
  collateral   DECIMAL(20,2),
  liq_price    DECIMAL(20,8),
  mark_price   DECIMAL(20,8),
  penalty_usd  DECIMAL(20,2),
  liq_type     TEXT,  -- NORMAL/CASCADE/HUNTING/ADL
  metadata     JSONB
);

SELECT create_hypertable('liquidation_events', 'timestamp');

-- 常用查询示例

-- 1. 过去 24 小时各协议清算总额
SELECT protocol,
       COUNT(*) as liq_count,
       SUM(size_usd) as total_size,
       AVG(size_usd) as avg_size,
       MAX(size_usd) as max_size
FROM liquidation_events
WHERE timestamp > NOW() - INTERVAL '24 hours'
GROUP BY protocol
ORDER BY total_size DESC;

-- 2. 连锁清算检测(5分钟窗口)
SELECT time_bucket('5 minutes', timestamp) as bucket,
       market,
       side,
       COUNT(*) as liq_count,
       SUM(size_usd) as total_size
FROM liquidation_events
WHERE timestamp > NOW() - INTERVAL '1 hour'
GROUP BY bucket, market, side
HAVING SUM(size_usd) > 10000000  -- > $10M
ORDER BY bucket DESC;

-- 3. 每小时清算热力图数据
SELECT time_bucket('1 hour', timestamp) as hour,
       market,
       SUM(CASE WHEN side='LONG' THEN size_usd ELSE 0 END) as long_liq,
       SUM(CASE WHEN side='SHORT' THEN size_usd ELSE 0 END) as short_liq
FROM liquidation_events
WHERE timestamp > NOW() - INTERVAL '7 days'
GROUP BY hour, market
ORDER BY hour;

Step 5:扩展 — 预测性清算预警(AI 增强)

预测性清算预警系统:
═══════════════════════════════════════

核心思路:
├── 不只是事后报告清算,而是事前预警
├── 监控当前持仓集中度和清算价格分布
├── 预测"如果价格到达 X,会触发多少清算"
└── 帮助交易者和风控团队提前准备

数据输入:
├── 各协议公开的持仓数据
├── 清算价格分布(部分协议公开)
├── 市场深度和流动性
├── 历史清算模式
└── 链上大额转入/转出(准备交易信号)

模型输出:
├── 清算热力图:每个价格点的预估清算量
├── 连锁清算概率:当前市场的级联风险评分
├── 清算猎杀预警:清算密集区接近当前价时告警
└── 保险基金压力测试:极端情景下基金耗尽概率

可视化示例(ASCII):

BTC 清算热力图(向下):
Price     Long Liquidation Volume
$64,000   █ $2M
$63,500   ██ $5M
$63,000   ████ $12M
$62,500   ██████████ $35M  ← 清算密集区
$62,000   ████████████████ $68M  ← 危险区域
$61,500   █████████ $30M
$61,000   ███ $8M

当前价:$64,200
最近清算密集区:$62,500(距离 2.6%)
风险评级:中等(距离清算密集区 > 2%)

Step 6:面试评分标准

系统设计面试评分标准(100 分制):
═══════════════════════════════════════

维度 1:需求分析(15 分)
├── 5 分:提出了 3+ 关键问题
├── 5 分:明确了功能/非功能需求
└── 5 分:需求合理、不过度设计

维度 2:规模估算(10 分)
├── 5 分:估算合理、有依据
└── 5 分:从估算推导出技术选型

维度 3:高层架构(25 分)
├── 10 分:架构完整、层次清晰
├── 10 分:组件职责明确、耦合度低
└── 5 分:数据流清晰

维度 4:核心组件(25 分)
├── 10 分:至少 2 个组件有详细设计
├── 10 分:数据模型/算法选择合理
└── 5 分:考虑了边界条件

维度 5:Trade-off 与扩展(25 分)
├── 10 分:分析了 2+ 个关键 Trade-off
├── 10 分:考虑了失败场景和降级方案
└── 5 分:提出了扩展方向

评分等级:
├── 90-100 分:Strong Hire(顶尖候选人)
├── 75-89 分:Hire(合格)
├── 60-74 分:Weak Hire(勉强合格)
├── 40-59 分:No Hire(需要更多准备)
└── <40 分:Strong No Hire

面试问题

Q1:跨链聚合器中,如何保证报价的准确性?

简短回答:三层保障——多层缓存确保数据新鲜度(L1 内存 <1ms、L2 Redis <5ms、L3 链上 <500ms),报价时附带滑点预估和有效时间,执行时用限价单保护用户(实际价格差于报价超过阈值则回退)。

详细回答

  • 数据层:价格缓存 500ms 刷新,WebSocket 订阅链上事件实时更新
  • 算法层:路由引擎考虑流动性深度,大额订单自动拆单
  • 执行层:用户设置最大滑点,合约级别保护(不满足则回退)
  • 监控层:持续追踪报价 vs 执行偏差,偏差 >0.5% 自动告警调优

Q2:清算监控系统中,如何处理极端行情下的数据洪峰?

简短回答:通过 Kafka 缓冲 + 流处理水平扩展 + 降级策略。Kafka 可承受瞬时 10 万+ QPS 的写入;流处理器按协议分片,水平扩展;极端情况下降级非核心功能(如历史查询),优先保障实时告警。

详细回答

  • 缓冲层:Kafka 分区按协议隔离,峰值数据不丢失
  • 处理层:Stream Processor 自动扩缩容,按协议分片
  • 存储层:Redis 写入优先(实时展示),TimescaleDB 异步批量写入
  • 降级策略:极端行情时关闭历史查询 API,只保留实时推送和告警

Q3:45 分钟系统设计面试中如何分配时间?

简短回答:5 分钟需求分析、3 分钟规模估算、10 分钟高层架构、15 分钟核心组件(深入 2-3 个)、7 分钟 Trade-off 分析、5 分钟总结陈述。关键是不要在任何一个环节花过多时间,保持结构化推进。


核心心得

系统设计面试核心要诀:

1. 结构化思维 > 技术深度
   └── 面试官看的是你的思考框架,而非具体技术

2. 需求分析是最重要的环节
   └── 错误的需求 → 错误的设计 → 全盘皆输

3. Trade-off 分析展现成熟度
   └── 没有完美方案,关键是知道取舍

4. 数字说话
   └── 规模估算让你的设计有据可依

5. 先广后深
   └── 先画完整架构,再深入 1-2 个核心组件

明日预告

Day 120:交易专题总结 — 知识图谱与面试答案集

  • 30 天交易专题知识图谱
  • 20+ 面试题完整答案集
  • 5 份系统设计文档索引
  • 关键数据点速查表
  • 求职策略与下一步计划