4. Serving系统架构:分层设计与交互流程

可疑交易推理链路对延迟、吞吐与可解释性要求极高。Serving系统采用四层解耦架构——接入层、编排层、推理层、存储层——每一层职责单一、可独立扩缩容,并通过标准协议交互。这种分层设计使得模型更新、特征扩展、规则调整互不干扰,是生产级推理链路的基石。

4.1 四层架构总览

下图展示了Serving系统的完整分层结构及各层之间的核心交互关系:

Serving系统四层架构与交互流程 Serving系统四层架构与交互流程 接入层 (Access Layer) HTTP/gRPC网关 · 鉴权限流 · 协议转换 · 请求校验 编排层 (Orchestration Layer) DAG调度 · 推理链路编排 · 上下文管理 · 超时/重试 推理层 (Inference Layer) 模型加载 · 特征计算 · 规则引擎 · 模型推理 · 结果聚合 存储层 (Storage Layer) 特征存储 · 模型仓库 · 结果持久化 · 缓存 · 审计日志 请求转发 推理任务下发 数据读写 特征/模型返回 推理结果 响应返回 说明:实线箭头表示请求/任务下发方向,虚线箭头表示数据/结果回传方向。各层之间通过 Protobuf 或 Thrift 协议通信。
设计原则:每一层只依赖下一层提供的服务接口,不跨层调用。接入层不直接访问存储层,编排层不直接管理模型实例。这种约束使得任何一层的内部重构都不会影响上下游。

4.2 各层职责详解

4.2.1 接入层 (Access Layer)

接入层是系统的流量入口,负责将外部请求转化为内部标准格式,并完成安全与流量控制。

  • 协议适配:支持 HTTP/REST、gRPC、WebSocket 等多种协议,统一转换为内部 RPC 调用。
  • 鉴权与限流:基于 API Key、OAuth2 或 JWT 进行身份校验;使用令牌桶或滑动窗口算法做限流。
  • 请求校验:校验必填字段、数据格式、字段范围,拒绝无效请求,避免脏数据进入下游。
  • 日志与监控:记录请求入口时间、来源 IP、请求体摘要,供审计和延迟分析使用。

4.2.2 编排层 (Orchestration Layer)

编排层是整个推理链路的大脑,负责将单个请求转化为一个可执行的推理 DAG(有向无环图)。

  • DAG 解析:根据请求中的交易类型、渠道、风险等级,动态加载对应的推理链路配置。
  • 节点调度:按拓扑顺序依次调用推理层各节点(特征提取→规则判断→模型打分→后处理)。
  • 上下文管理:维护请求级别的上下文对象,存储中间特征、中间结果、异常信息,供后续节点使用。
  • 超时与重试:为每个推理节点设置独立超时时间;对可重试的失败(如网络抖动)执行指数退避重试。
  • 结果聚合:收集所有节点的输出,组装成统一的响应结构返回给接入层。

4.2.3 推理层 (Inference Layer)

推理层是计算核心,承载模型加载、特征工程、规则执行与模型推理等计算密集型任务。

  • 模型加载与管理:支持热加载/卸载模型,多版本管理(金丝雀发布、A/B 测试)。
  • 特征计算:从原始交易数据中提取衍生特征(如交易频次、金额统计、设备指纹)。
  • 规则引擎:执行专家规则(如“单笔金额 > 50 万且交易时间在凌晨”),支持规则热更新。
  • 模型推理:调用机器学习模型(XGBoost、DNN、GraphSAGE 等)输出风险分数或分类标签。
  • 结果后处理:对模型输出做校准、阈值判定、置信度过滤,生成最终决策建议。

4.2.4 存储层 (Storage Layer)

存储层为上层提供数据持久化与缓存能力,是推理链路的数据底座。

  • 特征存储:存放离线预计算特征(如用户画像、历史行为统计),支持在线实时查询。
  • 模型仓库:存储模型文件(PMML、ONNX、SavedModel)及元数据(版本、创建时间、评估指标)。
  • 结果持久化:将每次推理请求的输入、中间结果、最终决策写入数据库,用于事后回溯与模型迭代。
  • 缓存:对高频查询的特征(如黑名单、白名单)使用 Redis 或 Memcached 加速。
  • 审计日志:记录所有数据变更操作,满足合规与监管要求。

4.3 层间交互流程

一次完整的可疑交易推理请求,在各层之间的典型交互时序如下:

步骤 发起方 接收方 交互内容 关键动作
1 外部客户端 接入层 HTTP POST /v1/risk/evaluate 鉴权、限流、请求校验
2 接入层 编排层 InternalRequest (Protobuf) 协议转换、路由到对应推理链路
3 编排层 推理层 (特征节点) FeatureRequest 调用特征计算服务,获取衍生特征
4 推理层 (特征节点) 存储层 QueryFeature(key) 从特征存储或缓存读取预计算特征
5 编排层 推理层 (规则节点) RuleRequest 执行专家规则,输出规则命中结果
6 编排层 推理层 (模型节点) ModelRequest 加载模型,执行推理,输出风险分数
7 编排层 存储层 SaveResult 持久化推理结果与中间数据
8 编排层 接入层 InternalResponse 返回聚合后的决策结果
9 接入层 外部客户端 HTTP 200 JSON 返回风险等级、决策建议、traceId
关键设计点:步骤 3-6 中,编排层对推理层各节点的调用是串行还是并行,取决于 DAG 定义。特征节点与规则节点通常可并行执行,模型节点依赖特征输出则必须串行等待。编排层需维护一个依赖计数器,当所有前置节点完成后再触发后续节点。

4.4 分层架构的优势

四层架构在金融风控生产环境中带来的具体收益:

  • 独立扩缩容:推理层是计算瓶颈,可单独增加 GPU/CPU 节点;接入层无状态,可快速水平扩展应对流量洪峰。
  • 故障隔离:存储层宕机不影响推理层已加载的模型;编排层超时机制可快速熔断下游故障。
  • 技术栈解耦:接入层用 Java/Go,推理层用 Python/C++,存储层用 Redis/MySQL,各层选择最适合的语言与框架。
  • 可观测性:每层暴露独立的 metrics(QPS、P99 延迟、错误率),通过 Prometheus + Grafana 快速定位瓶颈。
  • 灰度发布:推理层可同时部署 v1 和 v2 模型,编排层通过流量染色将部分请求路由到新版本,实现 A/B 测试。

4.5 典型部署拓扑

下图展示了一个生产环境中的物理部署拓扑,体现各层如何映射到实际服务实例:

Serving系统典型部署拓扑 Serving系统典型部署拓扑 接入层集群 Nginx + Kong / Envoy 4 节点 · 无状态 · 水平扩展 端口 443/8080 编排层集群 Go / Java 服务 6 节点 · 有状态(上下文) gRPC 端口 50051 推理层集群 Python Triton / TF Serving 8 节点 · GPU/CPU 混合 gRPC 端口 50052 存储层 Redis Cluster (缓存) · MySQL Cluster (持久化) · HDFS (模型文件) 3 副本 · 主从架构 · 跨可用区部署 RPC RPC 读写 读写 说明:接入层与编排层之间通过内部负载均衡(LVS/Consul)做服务发现;编排层与推理层之间使用 gRPC 长连接池减少连接开销。
避坑提示:不要将编排层与推理层部署在同一个进程内。虽然这样做可以减少一次 RPC 开销,但会导致:① 编排层故障拖死推理节点;② 无法独立扩缩容;③ 模型热更新时需要重启整个进程。生产环境必须保持进程级隔离。

4.6 层间通信协议选型

交互链路 推荐协议 序列化 理由
客户端 → 接入层 HTTP/1.1 或 HTTP/2 JSON 通用性强,便于外部系统集成
接入层 → 编排层 gRPC Protobuf 低延迟、强类型、支持双向流
编排层 → 推理层 gRPC Protobuf 长连接池、流式传输大特征向量
推理层 → 存储层 Redis 协议 / MySQL 协议 自定义 存储层原生协议,性能最优
层内节点间 gRPC 或 共享内存 Protobuf / FlatBuffers 同机部署时共享内存可减少拷贝
性能数据参考:在同等硬件条件下,gRPC + Protobuf 相比 HTTP + JSON 的序列化耗时降低约 60%,带宽占用减少约 40%。对于单次推理请求包含数百个特征向量的场景,这一差异直接影响 P99 延迟。