唯's Blog

笔者是一个热爱编程的 Java 程序员。

0%

获取曝光量Top100的帖子

用户每次在首页推荐获取10个帖子,下拉刷新,每次刷新产生的帖子记录成日志,日志内容包含10个帖子的id,日志的信息会发送到 MQ ,用于消费。

需求:

  • 给用户展示最近 24 小时曝光 top 100 的帖子,注意24小时是一个滑动窗口:每次读取都是最近24小时的曝光统计结果(不用精确到秒,最大延迟不应该超过10分钟)

  • 线上用户读取结果时,接口时延 P99 应该控制在 200ms 以下(忽略高并发问题,假设 qps=1)

  • 数量级:4000 万日志,4 亿条曝光,100万帖子

定义服务

  • 帖子推荐服务

存储

  • 结合数据量大、但是对 QPS 要求不高,接口响应时间要求高。

方案

方案1

  • 消费MQ,按10分钟维度去建立缓存,例如:id_202211251620 ,value就上一个窗口减去24小时前的窗口值,窗口期累积,并比较判断是否能计入top100 的zset,用户取zset就行

方案2

  • 经典 Flink 计算 topn 问题

方案3

  • 两个流 一个曝光流 一个过期流 一个加1 一个减1