构建实时欺诈分析流水线
架构详解:每秒摄取 5 万个事件,用智能信号进行富化,并借助我们的流式引擎在 10 毫秒内完成风险评分。
每秒处理 50,000 个指纹事件、为每个事件叠加智能信号富化,并在 10 毫秒内返回风险评分,需要一套精心设计的流式架构。本文将带你走一遍我们从摄取到决策的整条流水线。
摄取层
事件以 HTTPS POST 请求的形式,从运行在访客浏览器中的 JavaScript agent 发来。每个事件都包含加密的信号负载——通常是 8-12KB 的压缩数据,覆盖 130 多个浏览器信号。我们的边缘服务器负责终止 TLS、校验请求签名,并将负载转发到处理流水线。
我们采用多区域部署,边缘服务器与客户的 CDN 节点部署在同一地点。这使得全球 95% 的请求网络往返时延保持在 20ms 以内。边缘服务器是无状态的 Go 服务,运行在负载均衡器之后,根据请求量横向扩展。
信号提取
第一个处理阶段负责解密并解析信号负载。每个信号都会被提取、校验并赋予类型。Canvas 哈希会与已知的不可能取值进行核对(这些取值意味着 canvas 被屏蔽或被伪造)。WebGL 参数会做一致性交叉校验。Navigator 属性会与已知的有效组合进行比对。
这一阶段还会执行信号归一化。User agent 字符串会被解析为结构化组成部分(浏览器、版本、操作系统、设备)。屏幕尺寸会针对 DPI 缩放做归一化处理。时区偏移会与 IP 地理定位数据进行校验。
Smart Signals 富化
提取后的信号随后会接受 Smart Signals 分析富化——这是我们的服务端智能层。它包括无痕检测(将信号模式与已知的隐私浏览特征进行比对)、VPN 检测(将 IP 数据与时区、区域设置信号交叉引用)、浏览器篡改检测(识别表明信号被伪造的不一致之处),以及虚拟机检测(识别与 VMware、VirtualBox 及云端虚拟机相关的硬件特征)。
每个智能信号都独立计算,并同时给出布尔结果和置信度评分。富化阶段会为每个事件新增 24 个信号,提供超越纯客户端采集所能达到的全面威胁评估。
风险评分引擎
富化后的事件会被传入我们的风险评分引擎——一个在数百万条已标注事件上训练的梯度提升决策树模型。该模型会综合考量全部 130 多个原始信号、24 个智能信号,以及若干派生特征:速度指标(该设备在过去 5 分钟、1 小时和 24 小时内产生了多少事件)、历史行为模式,以及网络信誉评分。
模型输出 0 到 100 之间的风险评分,并附上最主要的贡献因素。例如,评分 85 可能会伴随「检测到 VPN」「无痕模式」「高速度——5 分钟内 47 个事件」等因素。这种可解释性对欺诈分析师至关重要,他们需要理解某个事件为何被标记。
存储与查询层
所有事件都会持久化到 ClickHouse——一个针对大规模数据集分析查询优化的列式数据库。ClickHouse 轻松应对我们的写入量(每秒 5 万个事件),其列式存储能在数十亿行数据上实现亚秒级的分析查询。
我们采用多层级留存策略。热数据(最近 7 天)存储在 NVMe SSD 上,以获得亚 100ms 的查询响应。温数据(7-90 天)存储在标准 SSD 上。冷数据(90 天以上)会被压缩并转移到对象存储,仍可查询,但延迟更高。
以 Kafka 为骨干
Apache Kafka 将整条流水线串联起来。每个阶段都从 Kafka 主题读取并写入。摄取层写入原始事件。信号提取阶段读取原始事件并写入提取后事件。Smart Signals 富化阶段读取提取后事件并写入富化后事件。风险评分引擎读取富化后事件并写入评分后事件。
这套架构带来若干优势:各阶段可以独立扩展,某一阶段的故障不会波及其他阶段,而且我们可以将事件重放到任意阶段以便调试或重新处理。Kafka 的消费者组支持每个阶段内的并行处理,其精确一次(exactly-once)语义确保没有事件被重复处理或丢失。
延迟预算
我们的端到端延迟目标是 10ms,即从富化后的信号负载到达处理流水线的那一刻,到返回风险评分的那一刻。预算的分摊方式如下:信号提取耗时 1-2ms,Smart Signals 富化耗时 3-4ms,风险评分耗时 2-3ms,序列化与响应耗时 1-2ms。在我们同地部署的架构中,各阶段之间的 Kafka 跳转增加的时延不到 1ms。
要在每秒 5 万个事件的负载下始终满足这一预算,需要在每个阶段都做细致的优化。我们使用预分配的内存池、零拷贝序列化,以及批量的 ClickHouse 写入。风险评分模型通过 ONNX Runtime 编译为原生代码,消除了 Python 解释器的开销。
Mark 花了两周时间对流水线做性能剖析,才在我们的分布式查找层里找到瓶颈——一把互斥锁把所有 goroutine 的查找串行化了。改用分片锁设计后,p99 从 48ms 降到了 9ms。有时候一旦找到问题,修复方法简单得令人尴尬。