Twitter 推荐算法工程实践:Scala-Finagle 下的实时候选生成、重排序与启发式过滤
基于 Twitter 开源算法,剖析 Scala-Finagle 在实时候选生成、ML 重排序及启发式过滤中的工程实现,提供高吞吐参数优化与监控策略。
在处理每日数亿条推文推荐的场景中,Twitter 的推荐系统通过 Scala 和 Finagle 框架构建了高效的分布式服务管道,确保实时性和可扩展性。核心观点在于,将候选生成、重排序与过滤模块化设计,能有效支撑 5 亿+ 用户的并发请求,而 Finagle 的异步 RPC 机制是实现低延迟的关键。
首先,实时候选生成是推荐管道的起点,旨在从海量推文中快速召回潜在相关内容。Twitter 系统分为 in-network(关注内)和 out-of-network(关注外)两种来源,前者通过 search-index 服务利用 Earlybird 搜索引擎检索用户关注者的最新推文,约占 50% 候选;后者则依赖 tweet-mixer 协调 GraphJet 框架进行图遍历,基于用户-推文交互图生成推荐。该设计证据可见于系统架构中,GraphJet 支持内存中动态图构建,避免了传统数据库查询的瓶颈,实现毫秒级召回。工程上,Finagle 的服务发现与负载均衡确保了多个候选源的并行调用,例如在 Scala 中定义 Future-based 接口:
def fetchCandidates(userId: Long): Future[Seq[Tweet]] = {
val inNetwork = searchIndex.fetchInNetwork(userId)
val outNetwork = tweetMixer.fetchOutNetwork(userId)
inNetwork.join(outNetwork).map { case (in, out) => in ++ out }
}
为实现可落地,建议设置候选池大小阈值为 1500-2000 条(in-network 约 700,out-of-network 约 800),监控遍历深度不超过 3 层以防计算爆炸;超时参数设为 50ms/调用,回滚策略为 fallback 到历史缓存。针对 500M 用户规模,部署时使用 Finagle 的 Hystrix-like 熔断器,阈值设为 99% 成功率以下触发,结合 Kafka 流处理 unified-user-actions 日志,确保实时更新交互图。
其次,ML-based 重排序聚焦于提升候选质量,使用 neural network 模型对召回结果进行精细评分。Heavy Ranker 模型集成在 home-mixer 服务中,输入包括用户嵌入(TwHIN)、社交图特征(SimClusters)和社会证明信号,输出互动概率分数。该模块证据在于其多任务学习架构,能同时预测点击、点赞等多维 engagement,避免单一指标偏差。Scala-Finagle 的优势体现在模型服务层,通过 navi(Rust 实现的 ML 推理引擎)暴露 gRPC 接口,实现高吞吐推理;例如,重排序管道可表述为:
def heavyRank(candidates: Seq[Tweet], userEmbedding: Embedding): Future[Seq[RankedTweet]] = {
val features = extractFeatures(candidates, userEmbedding)
naviClient.infer(features).map { scores =>
candidates.zip(scores).sortBy(-_._2)
}
}
落地参数方面,模型输入特征维度控制在 1000 以内,batch size 设为 32 以平衡延迟与 GPU 利用率;监控点包括推理延迟 P99 < 100ms、模型漂移检测(每周 A/B 测试 engagement 提升 >1%)。对于风险,如特征新鲜度衰减,实施 15 分钟窗口的实时聚合框架(timelines-aggregation-framework),并设置下线阈值:若 AUC 降至 0.85 以下,自动回滚至 light-ranker 预排序结果。
最后,启发式过滤确保输出内容的合规与多样性,结合 visibility-filters 和 heuristics 模块过滤有害内容并注入多样化元素。系统使用规则-based 和 ML 混合方法,如基于 tweepcred 的用户信誉阈值过滤低质推文,以及 NSFW 检测模型(trust-and-safety-models)硬过滤。该证据支持了产品质量提升,过滤后 engagement 率提高 20%。在 Scala-Finagle 中,过滤链作为 pipeline 环节实现:
def applyFilters(candidates: Seq[RankedTweet]): Future[Seq[Tweet]] = {
val safe = visibilityFilters.filterNSFW(candidates)
val diverse = heuristicMixer.injectDiversity(safe)
diverse
}
可操作清单:信誉阈值 > 0.5(PageRank 分数),NSFW 置信度 > 0.9 时硬删;多样性注入比例 10-20% 非热门内容,监控过滤命中率 < 5% 以避免过度过滤。扩展策略包括 Finagle 的服务分区,按用户地域分片部署,结合 Prometheus 指标追踪 QPS > 10k/s 时扩容。总体上,此架构通过参数调优(如超时 50ms、batch 32)和监控(P99 延迟、AUC),实现了高效、可维护的推荐服务,适用于类似社交平台的工程实践。