题目重点:设计趋势标签榜,明确总量与增长趋势的差异,处理迟到事件、删帖和刷量。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练以公开有效帖子中的normalized hashtag统计地区/语言窗口榜;一个帖子同一标签只计一次。窗口长短、用户重复上限和“趋势”的评分需先定。
- 本文给可解释的baseline:近期独立作者数与历史基线增长组合,不宣称平台真实公式;先做精确单地区窗口,再讨论近似全局规模。
解题路线
- 事件包括postId/revision/eventId/author/eventTime/tags/region及create/delete/visibility change。规范化大小写/Unicode与标签切分规则固定,索引只处理有权限公开参与的内容。
- 流处理按tag、地区和时间bucket聚合,eventId或post revision幂等。独立作者需(window,tag,user)去重,不能把一个用户1000帖变1000独立贡献。
- 近期绝对热度与trend分开:小历史基线的少量增长需最低支持数/平滑,避免1→3击败持续大规模真实热点。返回count、score与asOf,排序tie以tag确定。
- 维护每地区TopK候选,分片先保留足够候选再merge;若score是非线性增长率,不能简单把各分片TopK相加保证全局精确。精确需聚合同tag完整统计,或明确近似误差。
- eventTime窗口配watermark与迟到修正,删帖/转私密撤销贡献。超过保留范围的修正可批对账;榜单缓存短TTL,垃圾/攻击过滤和可见性抑制在发布前执行。
手动走一遍
tagA近1小时1000独立作者,通常900;tagB100,通常5。只按总量选A,只按无平滑比例会过度推B甚至1→3小样本。应先约定支持阈值与评分,再用历史回放检验刷量/本地真实事件。
规模与取舍
写入量由posts/sec×平均distinctTags决定,状态为活窗口tag-user贡献与bucket数量。Count-Min能估频但不能单独返回全部候选或精确独立作者;近似去重和候选索引需要单独结构与误差预算。
易错点与追问
容易失分的边界
- 趋势等于累计最多,会使老热点永远占榜。
- 只保存count不保存撤销贡献依据,删帖无法准确减。
继续深挖
- 地区不足数据时是否回退更大地区/全球?回退应展示口径。
- 私密内容能否参与聚合榜?默认排除,若产品允许匿名聚合需另定隐私阈值。
