技术深度解析
Nerve 的架构是对传统流处理器的彻底颠覆。大多数流处理引擎——如 Apache Flink 或 Kafka Streams——作为独立的计算层运行,在 RocksDB 或内存中物化中间状态,然后将结果写入外部数据库。Nerve 则直接将流处理嵌入 ClickHouse 的查询执行管道,使用与其分析查询相同的向量化引擎。
其核心是一个全新的 Stream 表引擎,将传入数据视为连续的块序列。每个块通过 ClickHouse 的原生 TCP 协议摄入,绕过 HTTP 层以降低开销。该引擎使用无锁环形缓冲区对传入行进行排队,同时一个专用的后台线程将这些行合并到现有的 MergeTree 分区中。这种设计消除了 Kafka 到 ClickHouse 管道中典型的序列化/反序列化开销。
关键架构组件:
- Stream 物化视图:Nerve 扩展了 ClickHouse 的物化视图,以支持滑动窗口(滚动、跳跃、会话)。视图定义是一个 SQL 查询,在每个传入块上运行,结果存储在目标 MergeTree 表中。与 Flink 的状态后端不同,Nerve 利用 ClickHouse 的列式压缩来存储状态,对于典型的聚合状态,内存占用减少了 3-5 倍。
- 精确一次语义:通过 ClickHouse 现有的仲裁插入和原子分区交换实现。每个流分区都有一个单调递增的序列号;如果节点发生故障,协调器从最后提交的序列号开始重放,确保无重复。
- 亚毫秒级查询路径:对流表的查询使用与批处理数据相同的索引结构。Nerve 为近期数据引入了一条“热路径”:最近 N 秒的数据以未压缩的列式缓冲区形式保存在内存中,允许查询完全跳过磁盘 I/O。该缓冲区异步刷新到磁盘。
基准测试数据(3 节点集群,c5.4xlarge,NVMe SSD):
| 指标 | Nerve(流) | Kafka + ClickHouse(批量摄入) | Apache Flink + ClickHouse |
|---|---|---|---|
| 端到端延迟(p50) | 0.4 毫秒 | 12 毫秒 | 8 毫秒 |
| 端到端延迟(p99) | 0.8 毫秒 | 45 毫秒 | 22 毫秒 |
| 吞吐量(事件/秒) | 10,000,000 | 2,500,000 | 4,000,000 |
| CPU 利用率 | 65% | 80% | 90% |
| 每节点内存 | 32 GB | 48 GB | 64 GB |
数据要点: 与 Kafka+ClickHouse 管道相比,Nerve 的 p99 延迟降低了 25 倍,同时每节点内存使用减少了 33%。这是因为 Nerve 消除了序列化/反序列化瓶颈以及流处理器与数据库之间的网络跳转。
开源仓库(clickhouse/nerve)目前日均获得 42 颗星,总星数达 1,200。代码库使用 C++17 编写,并大量使用 SIMD 指令进行向量化窗口操作。一个值得注意的 GitHub issue(#47)讨论了对乱序数据的事件时间处理支持——目前,Nerve 仅支持处理时间语义,这限制了其在数据延迟到达场景中的实用性。
关键参与者与案例研究
ClickHouse, Inc. 是主要开发者,核心贡献来自 Alexey Milovidov(ClickHouse 原创作者)以及由前 Apache Flink 提交者 Pavel K. 领导的专用流处理团队。该项目被定位为 Confluent 的 Kafka 和 Ververica 的 Flink 产品的直接竞争对手。
案例研究:QuantLab 的金融交易
QuantLab 是一家中频交易公司,用一个运行 Nerve 的 5 节点 ClickHouse 集群替换了原有的 5 节点 Kafka 集群 + 3 节点 Flink 集群 + 3 节点 ClickHouse 集群。其管道每秒处理 500,000 个市场数据 tick,计算 1 秒窗口内的 VWAP 和波动率指标。在 Nerve 之前,端到端延迟为 15-20 毫秒;迁移后,延迟降至 2 毫秒以下。该公司报告称基础设施成本降低了 40%。
竞争格局:
| 特性 | ClickHouse Nerve | Apache Flink | RisingWave | Materialize |
|---|---|---|---|---|
| SQL 支持 | 完整(ClickHouse 方言) | 部分(Table API) | 完整(兼容 PostgreSQL) | 完整(兼容 PostgreSQL) |
| 状态管理 | 列式 MergeTree | RocksDB | Hummock(LSM 树) | Persist(protobuf) |
| 精确一次语义 | 是(基于仲裁) | 是(基于检查点) | 是(基于 epoch) | 是(基于 Kafka) |
| 亚毫秒级查询 | 是 | 否 | 否 | 否 |
| 原生 ClickHouse 集成 | 深度 | 外部连接器 | 外部连接器 | 外部连接器 |
| 开源许可证 | Apache 2.0 | Apache 2.0 | Apache 2.0 | BSL(源代码可用) |
数据要点: Nerve 的独特优势在于其亚毫秒级查询能力和原生 ClickHouse 集成,这是其他流处理引擎所不具备的。然而,它缺乏 Flink 成熟的生态系统(例如,机器学习管道、复杂事件处理库)以及 RisingWave 的 PostgreSQL 兼容性。