1. 课程导入

在金融交易、数字货币、券商行情、风控监控等场景中,行情数据具有典型的“高频写入、海量存储、低延迟查询、多维分析”特征。一个可用的实时行情平台,既要能承接每秒数十万甚至百万级的逐笔与盘口更新,又要支持按标的、时间窗口、交易所、品种等维度做秒级聚合与历史回溯。本课程将以 ClickHouse 为核心存储与分析引擎,带你从零构建一套可落地的实时行情平台。

一、核心需求:行情平台到底在解决什么问题

行情平台的第一性需求不是“存下来”,而是“在正确的时间以正确的粒度被正确的人查到”。我们可以把需求拆成四层:

  • 接入层:对接交易所 WebSocket、TCP 组播、FIX 或第三方数据源,处理断线重连、乱序、重复与心跳。
  • 写入层:将逐笔成交、盘口快照、K 线等数据以高吞吐方式落库,保证不丢、少重、可追溯。
  • 查询层:支持最新行情点查、时间范围扫描、多标的聚合、分钟/小时 K 线生成。
  • 服务层:通过 API、WebSocket 推送或 BI 看板对外提供稳定、低延迟的数据服务。

这些需求共同决定了技术选型:传统关系型数据库在写入吞吐和聚合扫描上容易成为瓶颈;而 ClickHouse 的列式存储、向量化执行、MergeTree 系列引擎与物化视图,恰好匹配行情数据的写入与聚合模式。

二、ClickHouse 的定位:为什么是它,而不是别的

ClickHouse 在本项目中承担“实时写入 + 历史分析 + 聚合加速”三位一体的角色。它不负责消息缓冲,也不负责复杂事务,而是作为分析型存储底座,与 Kafka、Flink 或自研采集程序配合使用。

能力维度 行情平台要求 ClickHouse 对应机制
写入吞吐 每秒数十万行以上 批量插入、MergeTree 顺序写、分区裁剪
查询延迟 点查毫秒级,聚合秒级 主键索引、跳数索引、向量化执行
数据保留 热数据近实时,冷数据可归档 TTL、分区、冷热分层存储
聚合加速 分钟 K 线、成交量统计 物化视图、AggregatingMergeTree
扩展性 水平扩容、副本高可用 分片、副本、Distributed 表
ClickHouse 不是“万能数据库”。它擅长高吞吐写入与大规模聚合,不擅长高频单行更新和强事务。行情平台中“最新价”这类状态,通常用 Redis 或内存表辅助,而不是反复 UPDATE ClickHouse。

三、整体项目架构:从数据源到查询服务

本项目采用“采集 → 缓冲 → 入仓 → 聚合 → 服务”的分层架构。采集程序负责对接交易所并做初步清洗;Kafka 作为削峰缓冲;ClickHouse 承担明细存储与物化视图聚合;上层通过查询服务与推送网关对外输出。

交易所数据源 WebSocket / FIX 逐笔 / 盘口 / K线 采集与清洗 去重 / 补全 / 标准化 断线重连 / 心跳 Kafka 缓冲 削峰 / 解耦 / 回放 多分区并行消费 ClickHouse 集群 明细表:tick / orderbook 物化视图:分钟K线聚合 TTL / 分区 / 副本 查询与推送服务 REST API / WebSocket BI 看板 / 风控监控 Redis 缓存最新价

图中可以看到,Kafka 同时向 ClickHouse 明细表和查询服务供数:明细表用于历史回溯与聚合,查询服务用于实时推送与最新值缓存。这种“双通道”设计避免了所有查询都压到 ClickHouse 上。

四、学习路线:30 章如何一步步走完

本课程按“认知 → 建模 → 写入 → 查询 → 优化 → 实战”推进,建议按顺序学习,每章都配有可运行的 SQL 或配置片段。

  1. 认知与架构(第 1–4 章):需求分析、ClickHouse 定位、环境搭建、表引擎选型。
  2. 数据建模(第 5–10 章):行情表结构设计、分区与排序键、物化视图、K 线聚合模型。
  3. 写入链路(第 11–16 章):Kafka 接入、批量写入、去重、监控与背压。
  4. 查询与服务(第 17–22 章):点查、范围扫描、聚合查询、API 封装与推送。
  5. 优化与运维(第 23–27 章):索引、TTL、冷热分层、副本与分片、故障排查。
  6. 综合实战(第 28–30 章):完整平台部署、压测、复盘与扩展。
建议在学习每章时同步搭建本地 ClickHouse 与 Kafka 环境,边写 SQL 边观察执行计划。行情平台的问题往往不是“写不出来”,而是“写出来跑不动”。

五、常见误区与复盘

初学者在行情平台建设中容易踩三类坑:

  • 误区一:把 ClickHouse 当 OLTP 用。频繁单行 UPDATE 最新价会导致 part 过多、合并压力大。正确做法是用 ReplacingMergeTree 或外部缓存。
  • 误区二:忽略排序键与分区键。行情查询几乎都带时间范围和标的过滤,若排序键设计不当,扫描量会成倍放大。
  • 误区三:所有聚合都实时算。分钟 K 线若每次查询都从 tick 聚合,延迟和资源都不可控,应使用物化视图预聚合。
行情数据的时间字段务必统一时区与精度。交易所时间、采集时间、入库时间三者混淆,是后续对账和回测中最难排查的问题之一。