百万级内容社区信息流(上):技术架构全解

目录

信息流系统既要回答“这次返回哪些内容”,也要回答“这些内容现在是否允许被这个用户看到”。召回和排序决定相关性,内容状态、权限、用户选择与失败恢复决定系统能否正确交付。只画一条模型漏斗,容易遗漏后面这些约束。

本文以一个假设的百万级用户内容社区为规划背景,沿内容发布、特征更新、候选筛选到页面交付展开。规模和预算用于解释设计,不代表某个平台的内部实现或本文实测结果。运营、商业化与数据治理见下篇《百万级内容社区信息流(下):运营体系与商业化》。

从负载与目标开始,而不是先列组件

注册用户数不能直接换算成服务器数量。至少需要估计活跃用户、请求频率、峰值分布、候选数量、内容类型和模型开销。

例如,假设 100 万 DAU,每人每天发起 20 次 Feed 请求,则日请求量为 2000 万,全天平均约 231 QPS。若把峰值系数暂定为 8,峰值规划约为 1852 QPS;这只是待流量数据验证的假设。一次请求返回 20 条内容,也不等于用户产生了 20 次有效曝光。

如果先给模型决策链路分配 200ms 预算,还要说明起止位置,并为排队、特征访问、序列化和网络另留空间。多个阶段各自的 P99 不能简单相加得到整体 P99;最终需要在真实负载分布下测量整条链路。

可用性同样要有明确口径:返回 200 状态码但内容不可见、列表已过期或全部无法播放,不应自动算成功。服务端响应、客户端首屏和视频首帧是不同指标。

把异步生产与在线交付分开观察

内容发布不必等待全部检索索引和统计特征同步完成。可以先持久化内容及处理任务,再异步审核、转码与构建索引。在线请求使用可用候选和特征,完成召回、排序与最终可见性校验。

异步内容处理为索引提供数据,在线请求读取候选并校验后返回

两条链路分开,可以减少重处理直接阻塞请求的机会;它们仍共享资源与数据契约,不能称为完全解耦。索引积压会影响新鲜度,删除传播过慢会影响正确性,需要分别监控。

责任 关键状态 主要观察
内容主记录 当前版本、可见范围、发布状态 数据是否已可靠保存
异步处理任务 审核、媒体、理解与索引版本 积压、失败、重试和版本落后
在线决策 候选、特征、模型与策略版本 延迟、候选不足及结果组成
分发前校验 删除、权限、审核与用户控制 是否仍可交付
客户端消费 实际曝光、播放和操作结果 首屏、首帧、卡顿与有效反馈

消息、数据库、搜索、向量与流计算产品应按这些责任选型,不能因为图里列了 Kafka、Flink、Redis 和 Milvus,就认为每个阶段都必须部署它们。

发布流水线:不同任务可以并行,放行条件必须明确

发布时生成 content_id 与内容版本,持久化正文、媒体引用和待处理记录。重复提交用业务幂等键识别。若使用主库与消息队列,需处理双写失败,例如采用事务 Outbox。

审核、媒体准备和内容理解可以并行;但它们的结果必须绑定同一内容版本。旧版本的“审核通过”不能让刚修改过的正文直接上线。

审核、媒体准备和内容理解并行处理,同版本满足放行条件才进入候选池

任务 完成条件 失败或未决时
审核 当前版本达到适用的放行条件 保持待审或限制可见,进入复核
媒体处理 必需的文件可读、可解码、引用正确 重试处理或明确发布失败
内容理解 得到匹配版本的标签与特征 对允许缺省的特征使用已验证降级路径
索引投影 按版本写入所需检索渠道 补偿与重建,不把部分成功当全量完成
分发状态 必需任务满足规则 保留可解释的等待原因

“疑似违规进人工队列,不阻塞”只能表示不阻塞其他处理任务,不能默认表示允许推荐分发。理解超时也不能绕过审核门禁。

主库、搜索索引与向量库不是一个天然的原子事务。可以由状态机记录各投影进度,以版本条件更新防止旧任务覆盖新状态;删除或下架发布带版本的失效事件,并在分发入口再次校验,避免索引尚未更新时继续展示。

短视频需要单独定义处理与播放指标

上传时间取决于文件大小和网络,应与“上传完成到首个可播放版本就绪”分开统计。多码率转码、封面、字幕与质量检查可以有不同优先级;先交付合格的基础版本,再补充其他清晰度,是一种可选策略。

内容哈希可以辅助去重,但不能代替对象访问授权;知道哈希不应使用户取得他人私有媒体。CDN 预热也不是保证所有边缘节点都有副本,应按实际服务支持与热点选择执行。

播放使用统一时间轴和兼容的分片格式,码率档位要依据终端与网络;这些细节见《视频分片技术全解》。在没有固定分辨率、时长、编码设置和硬件测试前,不承诺所有视频两分钟转码完成。

特征工程先保证时间和版本正确

内容标签、用户行为、实时计数与请求上下文具有不同更新频率。每个特征应定义计算口径、数据版本、事件时间、可用时间、缺省值和过期策略。

特征 示例 需要防止的问题
内容语义 类目、标签、向量 正文修改后继续使用旧特征
统计特征 点击率、有效播放率 分母变化、迟到事件与小样本波动
行为序列 最近有效交互 重复、顺序错乱、超期保留
当前上下文 当前页面与会话操作 把未获准使用的信息带入决策
权限与模式 可见范围、个性化选择 缓存或特征更新延迟导致失效不及时

LLM 可以尝试同时提取标签与摘要,但多个任务合并到一次推理,不意味着评估、监控和成本都从 N 自动降到 1。其准确性与成本要按模型、输入长度、图片数量、失败重试及质量要求测量。日成本可以用“新增内容数 × 每条平均处理成本”估算,但每条价格需要来自实际选型或账单。

训练与服务一致,指相同语义下的时点对应

训练数据不能看到预测发生后才产生的点击与反馈,也不能不加区分地使用事后回补的特征。需要按样本时点重建当时可获得的信息,并核对线上离线计算逻辑。

Feast 的时点关联文档说明了历史特征对齐,也区分事件时间与创建/可用时间的处理。这类工具提供机制,仍需正确配置时间字段、保留历史版本并监控数据新鲜度。训练样本来自过去、在线预测发生在现在,两者不可能始终具有完全相同的数值。

把一次互动写进在线特征,只表示特征更新;模型参数是否更新,取决于训练流程。请求上下文也有读取与计算开销,不应在延迟表中写成严格的 0ms。

向量迁移要同时切换两侧模型与索引

用户向量和内容向量需要处于相容空间。模型升级时,即使维度相同,也不能直接假定新旧向量可比较。

可以先构建新内容索引,同时接收新增内容、修改和删除事件;用新用户塔生成查询向量,在同一实验版本下访问新索引。灰度验证候选质量、过滤和延迟后,再扩大流量,并保留可用的旧版本回退路径。

如果历史行为仍可用,新用户塔可以重新编码这些行为,不必等待固定的 3—7 天积累“新行为”。重算耗时和观察期则取决于内容规模、模型、算力、增量速度与实验所需样本。

召回与排序:每一阶段都要有明确收益

大规模候选通常分阶段处理。YouTube 的公开推荐论文采用候选生成与排序两阶段;具体系统是否再加入粗排和复杂重排,取决于规模、效果与成本,不是四阶段缺一不可。

从多路候选到最终列表逐步筛选,过滤和用户控制贯穿链路

一个说明性预算可以是:召回 50ms、粗排 30ms、精排 80ms、重排 30ms,合计 190ms,剩余 10ms 并不一定足够覆盖所有开销。它只是初始预算,必须通过并行调用、排队与尾延迟测试修正,不能作为实测 SLA。

多路召回与候选融合

候选来源可以包括协同过滤、向量、关注、热度、标签和受控探索。User-CF 按相似用户的偏好找内容,Item-CF 按内容间的行为关联找候选;“看了又看”更接近后者的常见用途。

不同召回路可能返回同一内容,合并时保留全部来源、版本和原始分数,以便解释结果。各路分数不一定在同一尺度,不能不经校准就相加。候选还要满足可见范围和内容状态要求,不能让权限过滤只存在于客户端。

Faiss 是相似检索库,应用需要自己承担相应的服务与数据生命周期;向量数据库或现有搜索系统则提供不同的集成能力。Faiss 文档也包含 CPU/GPU 等实现,不能简单定义为“小规模单机内存方案”。选型应使用自己的向量维度、更新率、过滤条件、召回率和并发负载测试,不能只套用“某产品固定 10ms”的表格。

冷启动是带约束的探索

新内容可以利用内容特征和有限的作者历史获得初始候选机会,但内容相似度不是原创权属证明,美学分也不能独立代表价值。探索预算还需要治理门禁、曝光人群与样本量约束。

可以分阶段扩大曝光,用实验调整策略;不把固定播放量、完播率和观察小时数标成“抖音模式”。仅靠 Boost 不能保证实际曝光配额,还需要检查候选供给、过滤、排序竞争和真实展示。

粗排、精排与多目标

粗排使用较低成本的模型筛选候选;双塔是选项之一,也常用于召回。用户塔可以使用实时信号,能否缓存取决于允许的陈旧程度。精排也可以批量推理,不必逐条串行执行。

FP32 向量改为 INT8,单看元素载荷约缩小到四分之一,并非减半;实际内存还包含尺度参数、索引与其他元数据。速度是否变快需要硬件、算子与质量测试,不能默认提升若干倍。

粗排与精排的训练数据都受曝光选择影响。召回后但未展示的候选没有自然获得真实点击标签;需要明确负采样、蒸馏或纠偏方法,不能把它们直接当作用户不喜欢的负例。

多目标可以组合点击、消费质量、互动和负反馈。加权前先定义事件与时间窗口,校准预测,并说明权重的业务含义。点击率提升不必然意味着用户受益,完播率升高也可能只是内容变短。需要联合评估,而不是从某一个指标直接推导标题党或信息茧房。

重排控制的是整张列表

重排可以加入同作者限频、类目多样性、新内容探索和广告约束。但应区分软目标与硬门禁:缺少候选时可以放宽某些多样性偏好,不能因此忽略下架、访问权限或用户屏蔽。

布隆过滤器适合近似筛掉已看内容,但存在误判,会把部分未看内容排除。它不是精确曝光账本,普通布隆过滤器也不支持任意删除;可以使用按时间分桶轮换的结构控制保留窗口。记录“已返回”和“已实际曝光”要分开,否则预取但未看的内容也会被长期排除。

Feed 分发:关注流与推荐流不必使用同一策略

关注流可以在发布时向粉丝收件箱扇出,也可以读取时合并作者发件箱,或混合两者。推荐流通常按当前请求生成候选,也可以使用预计算列表和短期缓存。

写时扇出和读时合并形成候选,推荐候选汇合后统一做可见性检查

写时扇出的代价与粉丝数、发帖频率、活跃比例和保留窗口有关;读时合并仍有发布存储与索引成本,不能称为写入零成本。切换阈值应来自测量,不是固定的一万或十万粉丝。

游标需要绑定稳定的分页语义

实时变化的列表直接用 offset 容易重复或跳过;游标也不能自动解决重新排序。可以让游标绑定一次候选快照或明确的排序键、并列打破键、版本与有效期,并检查其用户作用域和完整性。

搜索分页采用 search_after 时也要考虑索引变化与稳定排序;Elasticsearch 的分页文档讨论了与 PIT 配合的方式。游标不是可让客户端任意修改的数据库查询条件。

降级必须保留正确性门禁

失败环节 可准备的替代路径 仍然必须检查
精排不可用 用经过验证的粗排或简化模型 分数与特征契约
一部分召回超时 使用其他路或公共候选 候选质量与数量
特征存储超时 缺失特征模型或版本匹配的缺省值 不能随意给必需特征填零
个性化链路故障 编辑精选或热度候选 用户选择、屏蔽与可见范围
缓存不可用 有界本地候选或受控回源 过期状态、并发与源站容量

没有安全可交付的内容时,应返回明确的暂不可用或空状态,不能为了“永不空列表”展示被删除或无权访问的内容。预缓存列表不是 100% 可用性保障,治理状态服务本身也要设计降级约束与传播时限。

播放体验需要在客户端测量

预加载可以降低感知等待,也可能浪费带宽和电量。应按用户网络、流量偏好、设备能力及实际观看概率控制预取,而不是固定播放到 50% 就加载若干条。

分别测量列表返回、资源请求、解码准备与首帧,按网络和终端分组。封面占位不等于视频已播放,CDN 命中也不等于首帧达到目标。自适应码率和连接复用的收益需要用具体媒体与网络验证。

搜索与互动共享数据,但保留各自语义

搜索有显式查询,推荐主要从当前上下文与已允许使用的行为推断需求。两者可以共享内容处理和索引,但不同任务仍需不同的候选与相关性判断。

混合检索时,BM25 与向量相似分数不能未经处理直接相加;可使用合适的分数归一化、排名融合或学习排序。LLM 改写需保留原查询语义,精确名称、否定词和限制条件不能被改没。

跨场景行为是否共享,要符合已说明的处理目的和用户选择。“不推荐这类内容”不一定意味着用户主动搜索时也不愿看到,负反馈应保留作用范围。热点词与联想词也需要治理,不能只按计数直接公开。

互动关系与计数分开维护

点赞是“某用户对某内容处于点赞状态”,不是收到一次请求就执行一次 incr。需要幂等地记录点赞与取消,再把状态变化传播到计数、通知与特征。

可以以可靠持久化的关系或事件为依据异步维护 Redis 计数,并定期核对。若只更新 Redis 后周期性落库,应明确故障窗口内可能丢失的变化,不能当作天然可靠账本。

客户端乐观更新要在服务端拒绝时回退。评论发布成功也不一定立即公开,可能仍在审核状态。评论排序可考虑相关性、质量与多样性,但文本更长、点赞更多都不是质量证明;弹幕与评论也不能混成同一种排序机制。

审核是状态与证据流程,不只是分类器

发布前机器判断、人工复核与发布后举报巡查可以组合,关键是每次处置都能说明对象版本、证据、规则与处理结果。

机器判断形成通过、待复核或拒绝结果,发布后举报和复查触发新的状态变更

待审、拒绝、限制可见与撤销限制需要明确状态转换。下架后的索引、缓存、关注收件箱和 CDN 访问策略也要随之处理;对申诉成功的内容恢复分发时,应使用当前有效版本。

敏感词命中可以用于候选线索,不能把字符串算法匹配正确率等同于违规判断准确率。评估模型时应区分类别基线、精确率、召回率与误伤率,并记录标注规范。抽取少量视频帧也不等于完整覆盖全部画面。

刷量和搬运检测需要相应证据与复核。相似指纹可以发现重复候选,不能单独判定版权;设备信号也需要按必要范围使用。人工处理时效取决于到达量、优先级和处理能力,不应凭空保证固定覆盖比例或统一处理分钟数。

让实验和 Trace 能解释一次变化

一次推荐决策至少关联请求 ID、模型与索引版本、实验分组、召回来源、过滤原因、最终列表和各段耗时。敏感特征不宜无差别全量落日志,可保留受控快照或版本引用,并设置采样、权限与保留策略。

实验分流应稳定且可复现,记录实验盐值或版本,检查样本比例异常和跨组污染。用户级分流也不一定适合所有问题:创作者供给或社交传播可能影响其他用户,需要考虑实验单元与相互干扰。

在实验开始前确定主指标、体验约束、最小关注效果和分析方式。不要反复查看 p 值,一旦小于 0.05 就宣称胜出;固定观察窗口或采用适当的序贯方法,并处理多指标、多次比较。用户级实验的分析不能把同一用户每次曝光都当成独立样本。

Trace 能说明哪个版本产生了哪些结果,不能单独证明某项改动造成业务增量。离线评估、线上对照、错误分析和长期观察分别提供不同证据,结果应保留其适用范围。

信息流架构的主线是让内容、特征、决策与交付共享明确的版本和状态约束。先用可靠的数据与可解释的流程完成这个闭环,再根据实际瓶颈增加模型阶段和基础设施。运营如何利用这些能力,继续见下篇。

评论