Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯看点视频推荐索引构建方案

腾讯看点视频推荐索引构建方案

作者头像
腾讯云大数据
修改于 2021-01-08 08:22:39
修改于 2021-01-08 08:22:39
1.4K0
举报

腾讯云 Elasticsearch Service】高可用,可伸缩,云端全托管。集成X-Pack高级特性,适用日志分析/企业搜索/BI分析等场景


一、背景

在视频推荐场景中,一方面我们需要让新启用的视频尽可能快的触达用户,这一点对于新闻类的内容尤为关键;另一方面我们需要快速识别新物品的好坏,通过分发的流量,以及对应的后验数据,来判断新物品是否值得继续分发流量。

而这两点对于索引先验数据和后验数据的延迟都有很高的要求。下文将为大家介绍看点视频推荐的索引构建方案,希望和大家一同交流。

文章作者:纪文忠,腾讯QQ端推荐研发工程师。

注:这里我们把视频创建时就带有的数据称为先验数据,如tag,作者账号id等,而把用户行为反馈的数据称为后验数据,如曝光、点击、播放等。

二、看点视频推荐整体架构

从数据链路来看此架构图,从下往上来看,首先视频内容由内容中心通过消息队列给到我们,经过一定的处理入库、建索引、生成正排/倒排数据,这时候在存储层可召回的内容约有1千万条。

然后经过召回层,通过用户画像、点击历史等特征召回出数千条视频,给到粗排层;粗排将这数千条视频打分,取数百条给到精排层;精排再一次打分,给到重排;重排根据一定规则和策略进行打散和干预,最终取10+条给到用户;

视频在用户侧曝光后,从上之下,是另一条数据链路:用户对视频的行为,如曝光、点击、播放、点赞、评论等经过上报至日志服务,然后通过实时/离线处理产生特征回到存储层,由此形成一个循环。

基于此架构,我们需要设计一套召回/倒排索引,能够以实时/近实时的延迟来处理所有数据。

三、方案设计

在旧方案中,索引是每半小时定时构建的,无法满足近实时的要求。在分析这个索引构建的方案时,我们遇到的主要挑战有:

  • 数据虽不要求强一致性,但需要保证最终一致性;
  • 后验数据写入量极大,看点用户行为每日达到百亿+;
  • 召回系统要求高并发、低延迟、高可用。

1. 业界主流方案调研

通过对比业界主流方案,我们可以看到,基于Redis的方案灵活性较差,直接使用比较困难,需要进行较多定制化开发,可以首先排除。

因此我们可选择的方案主要在自研或者选择开源成熟方案。经过研究,我们发现如果自研索引开发成本较高,而简单的自研方案可能无法满足业务需求,完善的自研索引方案所需要的开发成本往往较高,往往需要多人的团队来开发维护,最终我们选择了基于ES的索引服务。

至于为什么选择基于ES,而不是选择基于Solr,主要是因为ES有更成熟的社区,以及有腾讯云PaaS服务支持,使用起来更加灵活方便。

2. 数据链路图

(1)方案介绍

如下图所示:

这个方案从数据链路上分为两大块。

第一块,先验数据链路,就是上半部分,我们的数据源主要来自内容中心,通过解析服务写入到CDB中。其中这个链路又分为全量链路和增量链路。

全量链路主要是在重建索引时才需要的,触发次数少但也重要。它从DB这里dump数据,写入kafka,然后通过写入服务写入ES。

增量链路是确保其实时性的链路,通过监听binlog,发送消息至kafka,写入服务消费kafka然后写入ES。

第二块,是后验数据链路。看点的用户行为流水每天有上百亿,这个量级直接打入ES是绝对扛不住的。所以我们需要对此进行聚合计算。

这里使用Flink做了1分钟滚动窗口的聚合,然后把结果输出到写模块,得到1分钟增量的后验数据。在这里,Redis存储近7天的后验数据,写模块消费到增量数据后,需要读出当天的数据,并于增量数据累加后写回Redis,并发送对应的rowkey和后验数据消息给到Kafka,再经由ES写入服务消费、写入ES索引。

(2)一致性问题分析

这个数据链路存在3个一致性问题需要小心处理:

第一,Redis写模块这里,需要先读出数据,累加之后再写入。先读后写,需要保证原子性,而这里可能存在同时有其他线程在同一时间写入,造成数据不一致。

解决方案1是通过redis加锁来完成;解决方案2如下图所示,在kafka队列中,使用rowkey作为分区key,确保同一rowkey分配至同一分区,而同一只能由同一消费者消费,也就是同一rowkey由一个进程处理,再接着以rowkey作为分线程key,使用hash算法分线程,这样同一rowkey就在同一线程内处理,因此解决了此处的一致性问题。另外,通过这种方案,同一流内的一致性问题都可以解决。 

第二,还是Redis写模块这里,我们知道Redis写入是需要先消费kafka的消息的,那么这里就要求kafka消息commit和redis写入需要在一个事务内完成,或者说需要保证原子性。

如果这里先commit再进行redis写入,那么如果系统在commit完且写入redis前宕机了,那么这条消息将丢失掉;如果先写入,在commit,那么这里就可能会重复消费。

如何解决这个一致性问题呢?我们通过先写入redis,并且写入的信息里带上时间戳作为版本号,然后再commit消息;写入前会比较消息版本号和redis的版本号,若小于,则直接丢弃;这样这个问题也解决了。

第三,我们观察到写入ES有3个独立的进程写入,不同流写入同一个索引也会引入一致性问题。这里我们可以分析出,主要是先验数据的写入可能会存在一致性问题,因为后验数据写入的是不同字段,而且只有update操作,不会删除或者插入。

举一个例子,上游的MySQL这里删除一条数据,全量链路和增量链路同时执行,而刚好全量Dump时刚好取到这条数据,随后binlog写入delete记录,那么ES写入模块分别会消费到插入和写入两条消息,而他自己无法区分先后顺序,最终可能导致先删除后插入,而DB里这条消息是已删除的,这就造成了不一致。

那么这里如何解决该问题呢?其实分析到问题之后就比较好办,常用的办法就是利用Kfaka的回溯能力:在Dump全量数据前记录下当前时间戳t1,Dump完成之后,将增量链路回溯至t1即可。而这段可能不一致的时间窗口,也就是1分钟左右,业务上是完全可以忍受的。

线上0停机高可用的在线索引升级流程如下图所示:

(3)写入平滑

由于Flink聚合后的数据有很大的毛刺,导入写入ES时服务不稳定,cpu和rt都有较大毛刺,写入情况如下图所示:

此处监控间隔是10秒,可以看到,由于聚合窗口是1min,每分钟前10秒写入达到峰值,后面逐渐减少,然后新的一分钟开始时又周期性重复这种情况。

对此我们需要研究出合适的平滑写入方案,这里直接使用固定阈值来平滑写入不合适,因为业务不同时间写入量不同,无法给出固定阈值。

最终我们使用以下方案来平滑写入:

我们使用自适应的限流器来平滑写,通过统计前1分钟接收的消息总量,来计算当前每秒可发送的消息总量。具体实现如下图所示,将该模块拆分为读线程和写线程,读线程统计接收消息数,并把消息存入队列;令牌桶数据每秒更新;写线程获取令牌桶,获取不到则等待,获取到了就写入。最终我们平滑写入后的效果如图所示:

在不同时间段,均能达到平滑的效果。

四、召回性能调优

1. 高并发场景优化

由于存在多路召回,所以召回系统有读放大的问题,我们ES相关的召回,总qps是50W。这么大的请求量如果直接打入ES,一定是扛不住的,那么如何来进行优化呢?

由于大量请求的参数是相同的,并且存在大量的热门key,因此我们引入了多级缓存来提高召回的吞吐量和延迟时间。

我们多级缓存方案如下图所示:

这个方案架构清晰,简单明了,整个链路: 本地缓存(BigCache)<->分布式缓存(Redis)<->ES。

经过计算,整体缓存命中率为95+%,其中本地缓存命中率75+%,分布式缓存命中率20%,打入ES的请求量大约为5%。这就大大提高了召回的吞吐量并降低了RT。

该方案还考虑缓了存穿透和雪崩的问题,在线上上线之后,不久就发生了一次雪崩,ES全部请求失败,并且缓存全部未命中。起初我们还在分析,究竟是缓存失效导致ES失败,还是ES失败导致设置请求失效,实际上这就是经典的缓存雪崩的问题。

我们分析一下,这个方案解决了4点问题:

  • 本地缓存定时dump到磁盘中,服务重启时将磁盘中的缓存文件加载至本地缓存。
  • 巧妙设计缓存Value,包含请求结果和过期时间,由业务自行判断是否过期;当下游请求失败时,直接延长过期时间,并将老结果返回上游。
  • 热点key失效后,请求下游资源前进行加锁,限制单key并发请求量,保护下游不会被瞬间流量打崩。
  • 最后使用限流器兜底,如果系统整体超时或者失败率增加,会触发限流器限制总请求量。

2. ES性能调优

(1)设置合理的primary_shards

primary_shards即主分片数,是ES索引拆分的分片数,对应底层Lucene的索引数。这个值越大,单请求的并发度就越高,但给到上层MergeResult的数量也会增加,因此这个数字不是越大越好。

根据我们的经验结合官方建议,通常单个shard为1~50G比较合理,由于整个索引大小10G,我们计算出合理取值范围为1~10个,接下里我们通过压测来取最合适业务的值。压测结果如下图所示:

根据压测数据,我们选择6作为主分片数,此时es的平均rt13ms,99分位的rt为39ms。

(2)请求结果过滤不需要的字段

ES返回结果都是json,而且默认会带上source和_id,_version等字段,我们把不必要的正排字段过滤掉,再使用filter_path把其他不需要的字段过滤掉,这样总共能减少80%的包大小,过滤结果如下图所示:

包大小由26k减小到5k,带来的收益是提升了30%的吞吐性能和降低3ms左右的rt。

(3)设置合理routing字段

ES支持使用routing字段来对索引进行路由,即在建立索引时,可以将制定字段作为路由依据,通过哈希算法直接算出其对应的分片位置。

这样查询时也可以根据指定字段来路由,到指定的分片查询而不需要到所有分片查询。根据业务特点,我们将作者账号id puin 作为路由字段,路由过程如下图所示:

这样一来,我们对带有作者账号id的召回的查询吞吐量可以提高6倍,整体来看,给ES带来了30%的吞吐性能提升。

(4)关闭不需要索引或排序的字段

通过索引模板,我们将可以将不需要索引的字段指定为"index":false,将不需要排序的字段指定为"doc_values":false。这里经测试,给ES整体带来了10%左右的吞吐性能提升。

五、结语

本文介绍了看点视频推荐索引的构建方案,服务于看点视频的CB类型召回。其特点是,开发成本低,使用灵活方便,功能丰富,性能较高,符合线上要求。

上线以来服务于关注召回、冷启动召回、tag画像召回、账号画像召回等许多路召回,为看点视频带来较大业务增长。未来随着业务进一步增长,我们会进一步优化该方案,目前来看,该技术方案还领先于业务一段时间。最后欢迎各位同学交流,欢迎在评论区留言。


最新活动

包含文章发布时段最新活动,前往ES产品介绍页,可查找ES当前活动统一入口

Elasticsearch Service自建迁移特惠政策>>

Elasticsearch Service 新用户特惠狂欢,最低4折首购优惠 >>

Elasticsearch Service 企业首购特惠,助力企业复工复产>>

关注“腾讯云大数据”公众号,技术交流、最新活动、服务专享一站Get~
关注“腾讯云大数据”公众号,技术交流、最新活动、服务专享一站Get~

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大厂的视频推荐索引构建解决方案
视频在用户侧曝光后,从上到下,是另一条数据链路:用户对视频的行为,如曝光、点击、播放、点赞、评论等经过上报至日志服务,然后通过实时/离线处理产生特征回到存储层,由此形成循环。
JavaEdge
2024/05/26
2280
大厂的视频推荐索引构建解决方案
E往无前 | 腾讯云大数据ES日志轻接入和免运维最佳实践
日志的采集、检索和分析是每个业务在架构设计上都需要考虑的重要一环,同时也是痛点较多、人力成本较高的一环。如何降低日志接入和后续运维成本,腾讯云大数据ES告诉你答案。
腾讯QQ大数据
2023/07/27
4461
E往无前 | 腾讯云大数据ES日志轻接入和免运维最佳实践
腾讯云ES:日志轻接入和免运维最佳实践
日志的采集、检索和分析是每个业务在架构设计上都需要考虑的重要一环,同时也是痛点较多、人力成本较高的一环。本文将从日志的生命周期开始,分析业界最成熟的ELKB解决方案在接入时和接入后的痛点,并通过在腾讯云ES上接入日志和运维索引的体验,分享腾讯云ES是如何解决这些痛点,来降低日志接入和运维成本,让业务能专注于日志数据价值的挖掘。
yinanwu
2022/12/05
1.3K0
亿级用户,腾讯看点信息流推荐系统的架构挑战
​导语 | 看点信息流每天为亿级用户提供海量实时推荐服务,除了大并发/低延迟/高性能等传统架构挑战以外,还有哪些推荐系统特有的架构挑战难题,又是如何解决的?本文是对腾讯看点独立端推荐研发中心总监——彭默在云+社区沙龙online的分享整理,希望与大家一同交流。
腾讯云开发者
2020/10/19
3.5K0
微服务重构:Mysql+DTS+Kafka+ElasticSearch解决跨表检索难题
在微服务拆分过程里,会对数据库模块重新进行建模拆分,导致部分表和数据,出现物理隔离,导致跨库JOIN的SQL不可行,并在数据检索上也有性能损耗的风险。下面我们来一起探讨一下,具体的解决方案。
后台技术汇
2024/09/19
4950
微服务重构:Mysql+DTS+Kafka+ElasticSearch解决跨表检索难题
京东二面:高并发设计,都有哪些技术方案?
那么高并发系统都有哪些经验,掌握核心技巧,你可以快速成为一个架构师,主导一些高访问量系统的架构设计
微观技术
2022/04/07
3810
京东二面:高并发设计,都有哪些技术方案?
20000字详解大厂实时数仓建设(好文收藏)
目前各大公司的产品需求和内部决策对于数据实时性的要求越来越迫切,需要实时数仓的能力来赋能。传统离线数仓的数据时效性是 T+1,调度频率以天为单位,无法支撑实时场景的数据需求。即使能将调度频率设置成小时,也只能解决部分时效性要求不高的场景,对于实效性要求很高的场景还是无法优雅的支撑。因此实时使用数据的问题必须得到有效解决。
五分钟学大数据
2022/02/12
5.3K0
20000字详解大厂实时数仓建设(好文收藏)
亿级流量!3倍并发!10倍平均耗时减少!腾讯会议高性能录制列表查询系统设计实践
列表查询是后台服务中非常常见的功能。其通常伴随着分页、排序等需求。虽功能简单,但一旦涉及海量数据量、高并发两大难题,列表接口的设计就会成为一个很大的挑战,轻则系统卡顿,重者后台奔溃。 本文总字数13000+字,10+设计示例图,旨在结合腾讯会议录制列表的实践,阐述如何设计一个高性能列表接口。
腾讯云开发者
2024/10/18
4060
亿级流量!3倍并发!10倍平均耗时减少!腾讯会议高性能录制列表查询系统设计实践
基于 Kafka 与 Debezium 构建实时数据同步
在进行架构转型与分库分表之前,我们一直采用非常典型的单体应用架构:主服务是一个 Java WebApp,使用 Nginx 并选择 Session Sticky 分发策略做负载均衡和会话保持;背后是一个 MySQL 主实例,接了若干 Slave 做读写分离。在整个转型开始之前,我们就知道这会是一块难啃的硬骨头:我们要在全线业务飞速地扩张迭代的同时完成架构转型,因为这是实实在在的”给高速行驶的汽车换轮胎”。
PHP开发工程师
2021/05/08
2.7K0
基于 Kafka 与 Debezium 构建实时数据同步
ES亿级商品索引拆分实战
伴随政府采购业务的快速发展,政采云的商品数据量也在快速膨胀,其中由 ES 进行提供的商品检索服务压力,也越来越大。由于商品模型中基础商品和交易商品的定义,导致商品本身的量会相对一般的电商场景多出一倍。
政采云前端团队
2023/09/01
6050
ES亿级商品索引拆分实战
ElasticSearch - 海量数据索引拆分的一些思考
一开始从索引参数调整, forcemerge 任务引入等多个手段来缓解问题,但是伴随数据的快速膨胀还是遇到类似高命中查询等难以优化的问题,从而引出了索引拆分方案的探索与实施。
小小工匠
2023/08/27
7400
ElasticSearch - 海量数据索引拆分的一些思考
有赞订单管理的三生三世与“十面埋伏”
有赞订单管理主要承接有赞所有订单搜索及详情展示功能,系统随着业务的不断发展经历了多次飞升之路。下面简单介绍下有赞订单管理系统的三生三世与“十面埋伏”。
有赞coder
2020/08/25
5070
有赞订单管理的三生三世与“十面埋伏”
轻量级SaaS化应用数据链路构建方案的技术探索及落地实践
导语 2022腾讯全球数字生态大会已圆满落幕,大会以“数实创新、产业共进”为主题,聚焦数实融合,探索以全真互联的数字技术助力实体经济高质量发展。大会设有29个产品技术主题专场、18个行业主题专场和6个生态主题专场,各业务负责人与客户、合作伙伴共同总结经验、凝结共识,推动数实融合新发展。 本次大会设立了微服务与中间件专场,本专场从产品研发、运维等最佳落地实践出发,详细阐述云原生时代,企业在开发微服务和构建云原生中间件过程中应该怎样少走弯路,聚焦业务需求,助力企业发展创新。 随着大数据时代的到来,企业在生产和经
腾讯云中间件团队
2022/12/20
9350
轻量级SaaS化应用数据链路构建方案的技术探索及落地实践
我们为什么放弃了TiDB,选择自研NewSQL
Fusion-NewSQL是由滴滴自研的在分布式KV存储基础上构建的NewSQL存储系统。Fusion-NewSQ兼容了MySQL协议,支持二级索引功能,提供超大规模数据持久化存储和高性能读写。
Bug开发工程师
2020/02/20
5.6K0
我们为什么放弃了TiDB,选择自研NewSQL
有赞亿级订单同步的探索与实践
有赞是提供商家 SAAS 服务,随着越来越多的商家使用有赞,搜索或详情的需求也日益增长,针对需求及场景,之前提到过的订单管理架构演变及 AKF 架构等在这两篇文章里已经有所体现,而这些数据的查询来自于不同的 NoSQL,怎么同步这些非实时存储系统将是一个很有趣的事情。
用户1278550
2019/04/25
1.1K0
有赞亿级订单同步的探索与实践
[万字长文]天机阁1.0百亿级实时计算系统性能优化
随着业务的发展,系统日益复杂,功能愈发强大,用户数量级不断增多,设备cpu、io、带宽、成本逐渐增加,当发展到某个量级时,这些因素会导致系统变得臃肿不堪,服务质量难以保障,系统稳定性变差,耗费相当的人力成本和服务器资源。这就要求我们:要有勇气和自信重构服务,提供更先进更优秀的系统。--导读
子非鱼i
2023/03/15
1.3K0
Flink在实时在实时计算平台和实时数仓中的企业级应用小结
在过去的这几年时间里,以 Storm、Spark、Flink 为代表的实时计算技术接踵而至。2019 年阿里巴巴内部 Flink 正式开源。整个实时计算领域风起云涌,一些普通的开发者因为业务需要或者个人兴趣开始接触Flink。
王知无-import_bigdata
2021/04/21
1.6K0
Flink在实时在实时计算平台和实时数仓中的企业级应用小结
如何基于日志,同步实现数据的一致性和实时抽取?
事情是从公司前段时间的需求说起,大家知道宜信是一家金融科技公司,我们的很多数据与标准互联网企业不同,大致来说就是:
宜信技术学院
2019/06/28
1.3K0
如何基于日志,同步实现数据的一致性和实时抽取?
常见面试题整理(2022-11)
Java Hotspot 虚拟机中,每个对象都有对象头(包括 class 指针和 Mark Word)。Mark Word 平时存储这个对象的 哈希码、分代年龄,当加锁时,这些信息就根据情况被替换为 标记位(轻重量级锁)、线程锁记录指针、重量级锁指针、线程ID等内容。
ha_lydms
2023/08/10
2370
常见面试题整理(2022-11)
【年度精选】高并发学习笔记
遵循"design for failure"的设计原则,未雨绸缪,具体优化方法有故障转移、超时控制、降级、限流
会玩code
2022/04/24
6460
【年度精选】高并发学习笔记
推荐阅读
相关推荐
大厂的视频推荐索引构建解决方案
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档