本文来自网易云社区
作者:李勇
背景
网易美学首页除了banner和四个固定位,大部分都是通过算法推荐获取的内容,其中的内容包括心得、合辑、视频及问答等。现在需要实现的是当推荐内容在用户屏幕曝光后(即用户一个屏幕内的内容),那么这些内容在一定时间内,如两周内都不能再出现,因此需要对这些已经曝光过的内容进行过滤。首页内容如下图所示:
实现方案
目前的实现方案是客户端对用户曝光的内容进行采集,然后通过DA的SDK将这些数据发送到Kafka Broker,然后再通过Kafka消费者去消费并解析这些数据,再将解析后的数据同步到Redis中。当用户再次获取数据时算法端会从Redis中获取需要过滤的数据,再将最终推荐内容返回服务端,然后服务端去业务数据库查询算法返回的数据对应的完整信息,最后将完整信息返回给客户端,客户端对数据进行渲染展现给用户。
具体实现分为两道工序:一个是曝光数据的收集,另一个是对曝光数据的过滤。
曝光数据的收集
数据的收集步骤如下:
客户端收集用户的曝光内容;
客户端通过DA的SDK将收集到的用户曝光内容发送到Kafka集群;
实时计算工程实时拉取Kafka的内容;
提取出曝光内容再进行解析;
将解析后的内容以Sorted Set数据结构维护到Redis中。
曝光数据的收集时序图如下图所示:
曝光数据的过滤
数据的过滤步骤如下:
用户使用客户端刷新首页数据;
客户端向服务端请求首页数据;
服务端在向算法端发送请求获取首页数据;
算法端根据服务端发送的用户个人信息,如用户id,用户设备id等信息,计算出推荐内容;
算法端从Redis中获取该用户最近两周的曝光数据进行过滤;
算法端将过滤后的推荐内容id和内容类型返回给服务端;
服务端根据算法返回的内容id和内容类型从数据库中查询详细信息并且组装数据;<