什么是 RTA?
一句话描述:RTA(Real-Time API)= 实时竞价接口,就是广告平台在每次广告曝光前,实时问飞猪"这个用户要不要投、出多少钱"的关键技术。
飞猪用户增长广告外部投放(RTA)系统自 2022 年上线以来,对接了头条、小红书、华为等 10+ 头部广告媒体渠道,日均处理千亿级请求(百万级 QPS),对低延迟、高吞吐、强稳定性提出极高要求。随着业务策略复杂度提升与流量规模持续增长,系统面临更高的性能与效率挑战。
为此,我们围绕两大核心目标展开系统性优化:
本文将按此结构,系统回顾我们的优化路径与核心成果。
整体链路架构
飞猪 RTA 作为广告投放的实时决策端,接收来自媒体的竞价请求。流量通过两种方式接入:
系统整体分为 网关层(承担高并发请求接入与流量路由)和业务逻辑层(在毫秒级窗口内完成设备解析、人群定向、策略召回、频控与出价计算等多阶段实时决策),最终返回竞价结果。
研发效能升级
早期 RTA 与多个业务模块共部署于同一应用。随着系统承载流量突破百万级 QPS,一个核心矛盾逐渐凸显:99% 的流量由 RTA 产生,但任何功能迭代都需全量发布,导致资源投入与业务价值配置需要重新审视。
这促使我们从两个维度重新审视系统设计:
基于此,我们决定以 RTA 为突破口,开展系统性效能升级——因其流量占比最高、优化 ROI 最显著,且业务逻辑相对独立,是验证新架构与新工具的理想载体。
优化方案
应用架构解耦 - RTA 独立拆分
识别核心矛盾、评估 ROI
在系统拆分上,优先考虑将 RTA 从原应用中拆出。有以下几点考虑:
在拆分过程中,曾评估切换到 GO(协程)方案,但综合考虑开发成本及后续维护成本后劝退。最终仍采用 Java 技术栈,但是升级了“大保健三件套”:JDK21(虚拟线程) + SpringBoot 3.x(比 2.x 快约 10-20%,依赖模块化初始化改进)+ 网络中间件优化(降低 I/O 开销与堆外内存)。
平滑迁移策略
为保障迁移过程零故障、可回滚,过程中作了以下关键思考:

发布提效
发布不仅是功能上线的终点,更是系统韧性的起点。尤其当单次故障恢复时间直接影响业务收入时,应用重启速度、发布流程确定性、回滚敏捷性,就成为了衡量工程成熟度的关键指标。
为此,我们以“分钟级恢复”为目标,从流程与性能两个维度优化发布链路:
发布流程对比:

测试提效
各媒体渠道环境高度异构且封闭,无法向开发或预发环境注入标准化测试流量。这导致传统 Mock 或人工构造用例难以覆盖真实长尾场景,逻辑变更后往往依赖线上验证,成本高、风险大。
针对测试成本大的问题,做了 2 点思考:
线上即标准:线上运行代码已验证可靠,其请求出入参可作为功能正确性的基准——预发环境用相同入参得到相同出参,即可判定代码正常;
真实流量即用例:线上流量天然覆盖最全场景,通过采集请求快照并在预发回放,可自动化完成功能验证与 diff 比对。
基于上面的思考,设计了一套流量采集和回放系统:

开发运维提效
AI Coding 代码重构
在 AI 时代背景下,大家都在尝试进行 AI-Coding 实践,我们也从工具 Claude、Cursor、Qcoder,到框架 BMAD、OpenSpec 基本都用了一遍,沉淀了一些较为可行的范式。
针对 RTA 多渠道接入的场景,通过 AI Coding,我们高效完成了核心链路的代码框架的升级:
最后整体的代码框架如下:
[MISSING IMAGE: , ] 监控体系精细化
原有监控体系已覆盖 iGraph 调用、广告召回等关键链路,但仅提供“成功 / 失败”的二元指标,存在局限:
为此,我们对强依赖接口进行深度可观测性升级:
优化成果
成本与性能
研发效率
极致性能优化
面对高并发实时系统,我们摒弃了"头痛医头"的优化方式,构建了从网络层→网关层→应用层→业务层的全链路性能优化体系:
网络层优化:根治跨地域网络耗时
在接入多个外部媒体 RTA 后,跨地域调用问题凸显。由于媒体机房分布广泛(覆盖华北、华东、华南等区域),而飞猪 RTA 服务当时仅中心化部署于单一机房,导致跨地域单元调用时出现严重超时:
关键验证:通过 CNAME 切换进行了快速验证——将小红书南通区域流量直接导向张北中心机房,省去南通→张北的网络中转环节,超时率从 30% 骤降至 8% → 证明物理距离是根本瓶颈。
[MISSING IMAGE: , ] HTTP 长连接复用
启用 HTTP 长连接复用,核心收益:节省 TCP 建连时间(~30ms)、RTT 次数从 2 次降为 1 次、减少系统开销(避免频繁握手 / 挥手)。
配置改造
通过调整网关层配置,显式启用 HTTP 长连接(Keep-Alive),并合理设置连接保活时长与单连接最大请求数,确保长连接有效复用。
keepalive_timeout 30s; # 默认 0(禁用)
keepalive_requests 200000; # 默认 100解决首次请求超时难题
首次请求必须经历 TCP 建连,建连耗时导致 HTTP 超时,超时又导致连接关闭,长连接无法建立。
为此,通过改造 HTTP 客户端底层实现:当 HTTP 协议层超时时,TCP 连接往往已建立完成,若底层 TCP 连接已成功建立,则保留该连接供后续请求复用,打破“超时 → 关连接 → 无法长建连”的恶性循环。
优化后,深圳机房 su121、南通机房 ea120/ea119 的 RTA 超时率大幅降低,但跨地域网络延迟的不确定性仍未根除。
单元化部署
长连接复用虽然缓解了问题,但物理距离带来的 RTT 波动仍是稳定性隐患。RTA 服务完成独立拆分、系统依赖大幅简化后,具备了实施单元化的技术条件。
单元化部署,核心是梳理 RTA 服务的依赖关系,并针对不同的依赖项,制定了不同的改造方案(仅列出部分):
优化成效:
单元化部署彻底解决了跨地域网络延迟问题:
网关层深度调优
作为流量入口,网关的性能直接影响系统整体稳定性。通过火焰图与 TCP 连接状态分析,我们发现异常现象:TIME_WAIT 连接数高达数千,而 ESTABLISHED 连接仅十余个。
这说明 Tengine 到后端应用也在使用短连接,每次请求都创建 / 销毁连接。TIME_WAIT 过多会导致端口耗尽、内存浪费(每个连接 2~4KB)和 CPU 开销增加。
Tegine 后端长连接优化
为了减少建连开销,我们在网关层启用与后端应用的长连接池,核心配置如下:
upstream triprta {
server 127.0.0.1:7001;
keepalive 64; # 与后端保持 64 个长连接
}
location / {
# === 新增:启用后端连接复用 ===
proxy_pass http://triprta;
# 启用 HTTP/1.1 以支持后端连接复用
proxy_http_version 1.1;
# 清空 Connection 头,确保使用 Keep-Alive 连接池
proxy_set_header Connection "";
# ← 新增:忽略后端返回的 Connection 头,避免后端返回的 Connection: close,使用后报错
# proxy_ignore_headers Connection;
# ← 新增:启用 TCP keepalive
proxy_socket_keepalive on;
}优化效果:
Tengine 配置精简
全盘梳理 Tengine 配置,针对性优化低效和冗余项:
应用层极致优化
应用层的性能瓶颈往往隐藏在非核心路径中,核心业务逻辑通常是经过多次优化的重点,而一些看似不起眼的非核心路径(如日志系统、下游服务调用等)往往成为隐藏的性能瓶颈。通过压测与线上监控,我们发现两个关键问题:日志埋点开销过大与下游长尾请求拖累整体 RT,并针对性实施优化。
日志系统优化
在高并发实时系统中,日志既是可观测性的基石,也可能成为性能瓶颈。通过 Arthas 火焰图分析 CPU 热点,发现日志埋点逻辑与核心 RTA 业务逻辑的 CPU 占比居然相当,是两个大头,表明日志系统仍然有优化空间。
鉴于日志埋点对业务监控、链路追踪等的重要性,我们无法简单地关闭或大幅减少日志。因此,从减少日志量和提升日志吞吐效率两个方面进行优化:
优化后,CPU 使用率降低了 9pt,整体日志文件大小减少了 60%,直接降低日志存储和分析成本。
主动熔断机制
在完成网络层、网关层的性能优化后,系统 P99 延迟已稳定满足媒体超时要求。但偶发的长尾“毛刺”请求(由瞬时 GC 抖动、资源竞争或下游微突发引起)仍可能影响毫秒级实时决策的稳定性。
为此,我们在核心依赖调用中引入主动超时熔断机制:对关键服务调用设置独立于全局超时的更严格执行时限,一旦超时立即中断并返回降级兜底结果,避免单点延迟拖累整体响应。
优化后,接口 P99 延迟波动显著平滑,各区域机房超时率进一步降低。
业务层优化:参竞率与准确率提升
核心洞察与背景
随着流量规模扩大,设备数量和类型同步增长,设备身份识别的一致性问题被放大,主要体现在以下三方面:
优化方案
优化效果
总结
通过两阶段的系统性优化,飞猪 RTA 在性能与效能上都有显著的突破:
未来,RTA 将持续深耕性能与业务双轮驱动:一方面保持对 RTA 极致性能的探索;另一方面深度融合 AI 能力,构建投放效果自动诊断与策略自优化机制,实现从“实时响应”到“智能决策”的跃迁,让 RTA 系统不仅更快,而且更聪明,真正成为驱动业务增长的智能引擎。