场景:设计一个金融交易监控系统
要求:
-
实时检测异常交易(<100ms)
-
每日生成风险报告
-
数据准确性要求100%
-
支持历史交易追溯
问题:
-
选择哪种架构?为什么?
-
画出架构图
-
说明各组件选型理由
一、架构选型:Kappa + Lakehouse 双轨架构
金融场景要求零数据丢失 + 精确一次 ,纯 Lambda 架构存在批流不一致风险。采用 Kappa 架构增强版:
-
流批一体,同一套数据源
-
所有明细数据入 Iceberg,保证 ACID + 时间追溯
-
流处理层做实时告警,批处理层做日终报表
二、架构图
BASH
┌─────────────────────────────────────────────────────────────────────────────┐
│ 金融交易监控系统架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【接入层】 【实时链路(流处理)】 【批处理链路】 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 交易 │ ───────────────▶ │ Kafka │ │ Kafka │ │
│ │ 前置机 │ 同步写入 │ Cluster│ │ 备份 │ │
│ └─────────┘ (实时消息) └────┬────┘ └────┬────┘ │
│ │ │ │
│ ┌─────────┐ ┌────▼────┐ ┌───▼────┐ │
│ │ 消息 │ ───────────────▶ │ Flink │ │ Spark │ │
│ │ 队列 │ │ 流处理 │ │ 批处理 │ │
│ │ (Queue) │ └────┬────┘ └───┬────┘ │
│ └─────────┘ │ │ │
│ │ │ │
│ ┌──────────┴──────────┐ │ │
│ │ │ │ │
│ ┌─────▼──────┐ ┌──────▼──────┐ │ │
│ │ Redis │ │ HBase │ │ │
│ │ 实时特征 │ │ 聚合结果 │ │ │
│ │ (<5ms查询)│ │ (实时存储) │ │ │
│ └─────┬──────┘ └──────┬──────┘ │ │
│ │ │ │ │
│ ┌─────▼──────┐ ┌────▼─────┐ ┌───▼────┐ │
│ │ 规则引擎 │ │ 结果 │ │ 日报表 │ │
│ │ (复杂规则) │ │ 写入 │ │ 输出 │ │
│ └─────┬──────┘ └────┬─────┘ └────────┘ │
│ │ │ │
│ ┌─────▼─────────────────────▼──────┐ │
│ │ Apache Iceberg │◀── 统一存储层 │
│ │ (ACID + Time Travel + Schema) │ 批流共用 │
│ └──────────────────────────────────┘ │
│ │ │
│ ┌──────────────┴──────────────┐ │
│ │ │ │
│ ┌─────▼──────┐ ┌──────▼──────┐ │
│ │ ClickHouse│ │ 历史追溯 │ │
│ │ 日报表分析 │ │ 查询接口 │ │
│ └────────────┘ └────────────┘ │
│ │
│ 【管控层】 │
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌────────────┐ │
│ │ 统一日志 │ │ 监控告警 │ │ 权限管理 │ │ 审计追溯 │ │
│ │ (ES+Loki)│ │(Prometheus│ │ (Ranger)│ │ (Immutable │ │
│ │ │ │ + Alert) │ │ │ │ 写入) │ │
│ └─────────┘ └──────────┘ └─────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
三、各组件选型理由
1. 消息队列:Apache Kafka
| 选型理由 | 说明 |
|---|---|
| 持久化复制 | 数据副本落盘,服务重启不丢数据 |
| Exactly-Once 语义 | 金融场景不允许重复消费或丢失 |
| 高吞吐 | 支持 100W+ TPS/秒 |
| 回溯能力 | 消息保留期内可重复消费,支持历史重放 |
替代方案对比:RocketMQ(功能类似但生态弱)、Pulsar(云原生但周边生态不如 Kafka 成熟)
2. 流处理引擎:Apache Flink
| 选型理由 | 说明 |
|---|---|
| Exactly-Once | 端到端精确一次,与 Kafka 完美配合 |
| 低延迟 | 微批次延迟可达 20-50ms,满足 <100ms 要求 |
| 复杂事件处理 | 支持 CEP(复杂事件处理),可配置滑动窗口+多流关联 |
| 乱序处理 | Watermark + 窗口机制处理乱序数据 |
| 状态后端 | RocksDB 状态存储,支持超大规模状态管理 |
3. 统一存储层:Apache Iceberg
| 选型理由 | 说明 |
|---|---|
| ACID 写入 | 写入即确认,100% 数据准确性 |
| Time Travel | 任意历史版本可查,支持 历史交易追溯 |
| 分区裁剪 | 按时间分区,日报表只扫描当天分区 |
| 流批一体 | Flink 实时写入 + Spark 批处理,共用同一张表 |
| Schema 演进 | 字段可新增,不影响历史数据 |
4. 实时特征存储:Redis + HBase
| 组件 | 用途 | 理由 |
|---|---|---|
| Redis | 实时特征缓存 | P99 < 5ms,高频特征快速读取 |
| HBase | 聚合结果存储 | 列式宽表,适合交易序列查询 |
5. 报表分析层:ClickHouse
| 选型理由 | 说明 |
|---|---|
| 列式压缩 | 金融数据压缩率高,存储成本低 |
| 向量化执行 | Analytics 查询极快 |
| SQL 接口 | 与现有 BI 工具无缝对接 |
6. 管控层
| 组件 | 选型 | 理由 |
|---|---|---|
| 日志 | ES + Loki | 全文检索 + 结构化查询 |
| 监控 | Prometheus + AlertManager | 指标采集 + 告警收敛 |
| 权限 | Ranger | 行级列级权限控制 |
| 审计 | 不可变日志表 | 写入后不可修改,满足监管要求 |
四、关键设计决策
1. 为什么满足 <100ms 延迟?
BASH
Kafka写入(10ms) → Flink处理(20ms) → Redis查询(5ms) → 结果返回(5ms)
↓
总耗时 ≈ 40-60ms(远低于100ms阈值)
2. 为什么保证 100% 准确性?
-
Iceberg ACID:写入即确认,不依赖最终一致性
-
幂等设计:Flink Checkpoint 机制保证故障恢复后不重复处理
-
对账层:日终与上游系统 T+N 对账,发现差异触发告警
3. 历史追溯怎么实现?
SQL
-- 查询任意历史时间点的数据状态(Iceberg Time Travel)
SELECT * FROM trades TIMESTAMP AS OF '2026-01-01 10:00:00'
WHERE trade_id = 'T20260101001';
-- 或者用版本号
SELECT * FROM trades VERSION AS OF 42;
展开几个核心组件的详细实现:
一、Flink 实时异常检测核心代码
三个核心模块代码已生成:
📦 文件清单
| 文件 | 说明 | 核心内容 |
|---|---|---|
TransactionAnomalyDetector.java |
Flink CEP 实时检测 | 规则1/2/3 检测 + Redis 关联 |
IcebergStorageLayer.java |
Iceberg 统一存储层 | ACID写入 + Time Travel + 分区策略 |
DailyBatchProcessor.java |
Spark 批处理层 | 日报表 + T+0对账 + 风险名单 |
docker-compose.yml |
容器化部署 | 全组件一键启停 |
🏗️ 架构分层总结
BASH
Kafka (Exactly-Once)
↓
Flink 流处理(实时告警 + Redis特征更新)
↓
Iceberg(ACID存储,流批共用) ← 核心统一存储层
↓
┌─────────────────────────────┐
│ ClickHouse(日报表分析) │
│ HBase(聚合结果) │
│ Redis(实时特征) │
│ ES(日志) │
└─────────────────────────────┘
⚡ 为什么满足 <100ms
| 环节 | 耗时 |
|---|---|
| Kafka 写入 | ~10ms |
| Flink 处理 | ~20ms |
| Redis 查询 | ~5ms |
| 总计 | ~35-60ms |
✅ 100% 数据准确性保障
-
Iceberg ACID:写入即确认,不依赖最终一致
-
Flink Checkpoint:故障恢复不丢不重
-
T+0 对账层:实时流 vs 批处理交叉验证