第1章:系统架构设计——Lambda与Kappa的抉择

大家好,我是你们的老朋友。今天咱们聊聊实时风控系统的架构设计。

说实话,我见过太多团队一上来就选技术栈,结果做到一半发现架构撑不住。嗯,这章咱们就把架构选型这件事掰开揉碎了讲清楚。

1.1 Lambda架构 vs Kappa架构

先问个问题:你的风控系统需要处理历史数据吗?

大部分场景都需要。比如你要计算用户过去30天的交易频次,或者做离线模型训练。这时候,Lambda架构和Kappa架构就成了两个主要选项。

Lambda架构:批处理层 + 流处理层 + 服务层。批处理负责全量历史数据,流处理负责实时增量数据,服务层合并结果。

Kappa架构:只用流处理层,通过重放消息队列中的历史数据来实现全量计算。

我个人习惯用Lambda架构做风控。为什么?因为风控场景对数据一致性要求极高。你想想看,如果因为数据延迟导致误判,用户投诉是小,资金损失是大。

但Lambda架构有个痛点——维护两套代码。批处理和流处理的逻辑必须保持一致,否则结果对不上。我在项目中遇到过这种情况:批处理跑出来的用户风险分是85,流处理实时算出来却是92,排查了半天发现是窗口函数实现方式不同。

我的建议:如果团队人力充足,选Lambda。如果团队小、追求快速迭代,Kappa更合适。但记住,Kappa对消息队列的存储能力要求很高。

Kappa架构的优势在于简单。所有数据都走流处理,没有批处理层。但代价是——你需要一个能存下所有历史数据的消息队列。Kafka默认的保留期是7天,你要改成30天甚至更久,磁盘开销不小。

我曾经在一个项目中尝试用Kappa架构做实时风控,结果发现历史数据重放需要3小时。嗯,这个延迟对风控来说有点长。后来还是改回了Lambda。

1.2 实时计算引擎选型:Flink vs Spark Streaming

选计算引擎,说白了就是选Flink还是Spark Streaming。我两个都用过,说说我的感受。

对比维度 Flink Spark Streaming
实时性 真正的逐条处理,毫秒级延迟 微批次处理,秒级延迟
状态管理 原生支持,功能强大 需要借助外部存储
事件时间 原生支持,watermark机制完善 支持但配置复杂
SQL支持 Table API + SQL Structured Streaming
社区活跃度 高,阿里贡献大量代码 更高,生态更成熟

我个人习惯用Flink做实时风控。原因很简单——风控需要真正的实时。你想想看,用户正在下单,你等5秒才算出风险分,黄花菜都凉了。

Flink的事件时间处理能力是它的杀手锏。风控场景中,数据可能乱序到达。比如用户先点支付,后点下单(网络延迟导致)。Flink的watermark机制能正确处理这种乱序。

避坑指南:我曾经在Spark Streaming上踩过坑。微批次默认是2秒一个批次,但风控场景要求毫秒级响应。虽然可以把批次间隔调到100ms,但这样吞吐量会大幅下降。Flink就没有这个问题。

不过Spark Streaming也有它的优势。如果你的团队已经熟悉Spark生态,比如用Spark做离线ETL,那选Spark Streaming可以复用技术栈。而且Spark Streaming的容错机制更成熟,checkpoint恢复速度更快。

嗯,这里有个小技巧:如果数据量不大(每秒几千条),两个引擎差别不大。但如果数据量达到每秒百万级,Flink的背压机制会让你省心很多。

1.3 消息队列选型:Kafka vs Pulsar

消息队列是实时风控的「血管」。数据从业务系统流过来,经过消息队列,再到计算引擎。选错了,整个系统都会卡脖子。

对比维度 Kafka Pulsar
架构 分区 + 副本 计算存储分离
存储 本地磁盘 BookKeeper(可分离)
延迟 毫秒级 毫秒级
消息重放 按offset重放 按时间/位置重放
运维复杂度 中等 较高

Kafka是业界标准,我用它做了五六年。它的优势是稳定、生态好、社区资源多。但Kafka有个问题——扩容麻烦。你要增加分区数,得重新分配数据,这个过程很痛苦。

Pulsar的架构更先进。计算和存储分离,扩容只需要加broker节点,数据自动均衡。我在一个项目中用过Pulsar,扩容确实方便,但运维成本高了不少。

我的建议:如果团队运维能力强,选Pulsar。如果追求稳定和生态,选Kafka。我个人习惯用Kafka,因为踩过的坑少,文档也全。

曾经有个项目,我们用Kafka做风控消息队列,每天处理10亿条消息。Kafka扛住了,但磁盘IO成了瓶颈。后来我们做了消息压缩和分区优化,才把性能提上来。

Pulsar的优势在于消息保留时间长。Kafka默认7天,Pulsar可以轻松做到30天甚至更久。这对Kappa架构来说是个福音。

1.4 数据存储选型:ClickHouse vs Druid

实时风控计算完的结果,得有个地方存。既要支持实时写入,又要支持快速查询。ClickHouse和Druid是两大热门。

对比维度 ClickHouse Druid
写入性能 极高,百万行/秒 高,十万行/秒
查询性能 极快,列式存储 快,预聚合
实时性 秒级可见 秒级可见
SQL支持 完整SQL 类SQL
运维复杂度 中等 较高

ClickHouse是我目前的主力存储。它的写入速度惊人,我测试过单机每秒能写80万行。查询也快,特别是聚合查询,秒出结果。

Druid的优势在于预聚合。它会把数据按时间粒度预计算好,查询时直接拿结果。这对风控场景的「用户风险分趋势图」这类查询特别友好。

我的经验:如果主要做明细查询和实时写入,选ClickHouse。如果主要做聚合查询和时间序列分析,选Druid。我个人的风控系统里,ClickHouse存原始事件,Druid存聚合指标。

曾经有个项目,我们用Druid做风控指标存储。查询确实快,但数据摄入配置很复杂。后来换成了ClickHouse,配置简单多了,而且SQL支持更完整。

嗯,这里要注意:ClickHouse的更新操作比较弱。它适合写一次读多次的场景。如果你的风控指标需要频繁更新(比如用户风险分实时变化),那ClickHouse可能不是最佳选择。

1.5 架构选型总结

说了这么多,最后给个总结性的建议:

  • 架构:团队大选Lambda,团队小选Kappa
  • 计算引擎:追求实时性选Flink,追求生态选Spark Streaming
  • 消息队列:求稳选Kafka,求灵活选Pulsar
  • 数据存储:明细查询选ClickHouse,聚合查询选Druid

没有银弹,只有最适合你场景的方案。我见过用Flink + Kafka + ClickHouse的组合做风控,也见过用Spark Streaming + Pulsar + Druid的组合。关键是要理解每个组件的优缺点,然后根据你的业务场景做取舍。

好了,这章就到这里。下一章咱们聊聊实时风控指标的具体设计,包括窗口计算、去重、累加这些核心逻辑。


公众号:蓝海资料掘金营,微信deep3321