简介:6月14日“腾讯创新日:科技年的技术盛宴”,代表腾讯各业务群技术实力的四级专家与腾讯微创新2016年创意获奖团队齐聚一堂,畅谈AI、系统安全、架构设计、社交、推荐模式、游戏引擎、腾讯应用创新等前沿技术。唐刘溪,社会效果广告部系统中心主任、专家工程师,分享下一代全方位广告系统架构。
游戏、广告和电子商务是互联网的三大现金流业务。2016年,腾讯广告收入增长54%,达到270亿。本次分享将与您探讨腾讯统一广告系统广告业务的特点,对技术架构的特殊要求,以及支持和推广腾讯社交和效果广告的技术架构。社会、效果、品牌广告的统一广告体系应该具备怎样的架构和基本能力?
以下是唐对讲话的记录
大家好,很高兴有机会和大家分享腾讯的社交和效果广告系统。
腾讯的社交和业绩广告(SPA)从广电通开始发展到现在,从每天一百万的收入发展到现在的一千万,直到未来系统的目标可以达到每天十亿以上。这个架构经历了很多年的演变,核心没有太大变化。在这里,让我们与您分享我们架构的方法论和演进过程。
我的分享分为几个部分,首先介绍系统架构,然后是SPA R&D系统,然后介绍一些架构中感兴趣的系统,一个是检索系统,它是我们架构的核心,另一个是数据分析引擎。
系统结构
这是我们整个SPA业务的系统架构。如你所见,这里粗黑线是系统的数据流,数据是我们系统的关键因素。我们的整个系统是建立在数据的基础上的,用来不断优化系统。这种商业模式其实是互联网中的经典商业模式,包括搜索、广告、电子商务,都是基于数据的大型系统。腾讯SPA广告系统是一个很好的数据驱动的商业模式。
整个广告系统可以分为几个部分,最底层是广告引擎,它处于我们系统的引擎位置。为什么叫发动机?因为广告引擎的作用是匹配流量端的广告数据,比如微信、QQ、广告端,从数千个广告中选择一个,挑出前100个广告。
然后就是我们的玩法平台,会做一些和玩法相关的策略。然后是投放平台,是我们和广告主之间的接口。广告主投放创意,观察投放效果。下面是日志平台,每个数据的生产点都不一样。每个请求都有一个请求日志,广告公开后有一个公开日志,用户点击后有一个点击日志。如果发生转换,广告商也会将数据转换给我们。这些数据是系统中某个时间点用户的切片,在时间轴上是不同的,所以我们需要一个系统来对齐所有的数据,我们称之为日志处理平台。它将数据反馈到模型训练平台,在那里可以用于学习和预测。广告系统还有垂直服务,比如DMP数据管理平台,广告主可以上传自己的用户数据,和腾讯内部的用户数据进行交叉分析,得到自己感兴趣的人。
接下来,我将从广告商的角度,然后从流量的角度,来分析系统的数据流。
广告主的第一个行为是上传他的广告,设计一个创意,选择一个定位,上传这个广告。有了这个行为,系统会自动将广告插入到广告库中,除了正常的数据库操作之外,还会生成一个序列号,对于我们的系统来说相当于一个心跳,对于我们系统的稳定非常关键。我们用开源软件zookeeper,用5台机器搭建的集群生成一个序列号。因为有5套,可以容灾,只要3套正常工作,整个系统就可以正常工作。整个系统通过流水驱动下一个过程。然后是发布系统,根据水流情况将广告库扩展到广告级别,部署到天津、上海、深圳的数据中心。然后是检索系统,建立倒排表,将广告质量的数据流与广告级别关联起来,生成索引文件。我们有了索引文件之后,就会加载我们的索引文件,向外界提供服务。
接下来是流量端。首先,有一个广告位管理系统。我们有一个拥有数十万个广告位的移动联盟业务。对于这么大规模的广告位,没有办法人工管理,所以我们开发了一个广告位管理系统。我们有很多种途径。在CGI模块中,我们将所有的访问转换成一个通用的请求,并屏蔽后端特定的访问方法。在Mixer模块中,我们会将QQ用户数量扩展到用户的年龄和性别,还有很多垂直业务,比如再营销。电子商务平台上用户的一些用户行为,如下单、收款等,也在这里进入我们的系统。Mixer将流量终端用户ID扩展到用户画像后,会请求检索系统,我们会将其与广告数据关联起来进行操作。对于检索系统的返回,将为每个广告请求点击率预测和转化率预测服务,并将这些预测值乘以广告的投标价格,以形成称为ECPM的分数,我们使用该分数来排序和形成最有价值的广告,以返回到流量侧。
从前面的过程可以看出,我们整个广告系统是一个长链的系统,整个广告系统可能是一条由许多珍珠组成的项链。当某个需求落地的时候,一定和很多环节有关。我们现在有几十个网络服务,每天100多个改动,整个部门几百个工程师,在线一万多台服务器,总共800多万行源代码。整个部门每天收入几千万。这里有一个冲突,如何在需求的变化和系统的稳定性之间找到平衡,因为整个系统每天产生几千万的收益。如果遇到代码bug或者发布问题,应该因为损失而被追究责任。我们怎么解决?经过思考和创新,我总结出了一套玩法,或者说最佳做法。首先统一代码规范,底层开发一个建筑系统Blade。我们强制所有代码在提交之前都要经过代码审查。然后是自动化工具检查和系统的持续集成。经过一系列的方法或规范,我们已经在稳定性和敏捷性之间取得了平衡。
如你所见,我们的系统是一个长链系统,但是如果我们看每一个网络服务,我们是分层的。底层是构建系统,在其上我们聚集了大量对大规模软件工程的理解,比如集成更好的对单元测试的支持,集成对内存泄漏检测的支持,集成对协议缓冲区的支持,使得协议缓冲区生成的文件不需要提交到代码库,从而保持代码库的整洁。Blade上有一个基本库,比如文件系统的封装,也就是文件类,可以统一访问本地文件或者网络文件。C++访问hdfs比较麻烦。我们抽象之后,集中精力解决大家认为棘手的问题,让所有使用这个文件类的人都能得到好处。这个C++是内部开源的,可以看看。有了一个基于C++的RPC网络框架和Blade的支持,在这里开发一个网络服务是非常容易的。网络框架之上是各种网络服务,用来构建整个SPA架构。现在,每天有7000多万股水流。可以看看。有流量接入的CGI。这里是一个可以监控系统变化的实验系统。里面有一个细行,可以把检索系统返回的广告按十分之一或者十分之一排序。所有这些服务都基于同一个网络框架,所以我们可以做得更好。
检索服务
接下来说说网络服务中一些有趣的检索服务。如你所见,检索服务处于链的中间,之前没有用户数据,之后也没有广告数据,所以这个检索是两个数据的交集。
我们已经通过三个版本迭代了检索服务,第一次意识到它是以传统的倒排表的形式,例如,结合年龄、性别、规格和地区。反相表后过滤的逻辑。这个架构面临一些问题。首先,它的复杂性是m× n。然而,广告的增加是我们业务的动力。比如随着电子商务的推广,广告数量会翻倍,系统的性能会急剧下降。还有一个挑战,因为倒排只有6维,如果超过6维,就需要用代码实现方向逻辑。但实际上,目标产品是广告产品的驱动力,我们倾向于添加越来越多的目标产品,这将导致代码越来越复杂,最终导致代码失控。
然后我们开发了第二代系统。我们做的第一件事是将方向接口抽象成一个四层树,实际上是一个四层逻辑树。下线的时候,把它变成三层结构。它解决了算法性能随着广告数量的增加而下降的棘手问题。二代系统上线后,效果更好。首先,它增加了方向,所以您不必更改代码。这是最大的好处。还有其他优点,因为索引和定向接口是标准化的,减少了大量的通信工作。还有,方向维度是反转的,所以添加方向产品不会导致性能下降。但是,后面还有一些挑战。首先是索引和排序之间的挑战,遇到了检索和排序之间的问题。它们通过数据耦合在一起,当需求发生变化时,应该经常修改这个接口。第二,所有方向都在统一的64位空,所以无法支持不同空之间信息的混合排列。例如,当苹果被分类时,它们不知道是被分类为水果还是3C。没有一维的击中信息,比如击中一个苹果。不知道这个广告是因为打了一个苹果而触发的,不是别的。
所以和三代系统一起,2013年12月提出开发三代系统,2014年5月全面上线。我们可以在Query和广告的两端都支持方向表达式,现在处于行业领先水平。第三代系统的特点是:第一,定向能力更强,因为它不是四层树,而是递归的多分支树;其次,它标准化了分类界面,通过它每个人都可以开发和交流。另一个关键特性是它可以集成各种用户身份。腾讯有很多用户身份,比如QQ号和微信号,IMEI和浏览器也有自己的身份。该系统的能力是打开所有接口,这是我们系统成功集成的关键特征。四是支持不同空之间信息的混合排列,每个方向ID属于相同空或不同空。第五,提供了附件机制,每个广告都有一个附件,可以添加二进制信息流。我们的系统是2014年4月上线的,现在线下有100多台机器,线上有上千台机器,每天收入几千万。
接下来我就说说检索系统要解决的核心问题。抽象这个问题,我们可以看到,有两个简单的问题。
第一个问题是用户特征和广告定位要求要能匹配。广告导向需求是一个逻辑表达式,这里是递归定义的多树。比如一个用户的头像,男,27岁,广州。第二个问题是流量需求和广告属性的匹配。比如有两个广告,第一个广告属性是教育行业的文字广告。检索系统需要做的是在很短的时间内快速解决两个表达式的匹配,我们可以在5毫秒内解决几十万个复杂的表达式。如何解决这个问题?因为时间要求特别严格,如果对每个递归多树进行特征测试,不可能在这么短的时间内完成操作。
我们对这个逻辑运算问题进行了创新,把它转化为一个计数和搜索问题。首先,我们将递归多树转换为或-与-或表达式。当我们进行转置时,我们单独处理或节点。对于“与”节点,我们需要准确存储它。举个例子,这里有个例子。广告1将“与”节点转换为内部数据结构。有三次命中计数,也就是说需要被命中三次才能触发。对于20-30岁和40-50岁的用户,我们将其存储为匹配1。这是匹配的原子单位。你可以看到这一节有一些传统结构中没有的东西,这是我们结构中更好的创新。这个区间的意义是很多离散的空可以作为索引中原子的匹配项。
一种技术是把经纬度转换成整数,你可以把它想象成小方块来描述地图上的不规则多边形。但是有了这个区间,就可以用不同大小的正方形来描述同一个多边形,从而节省了很多小的正方形节点。所以这个区间是我们的创新,当然整个算法是一个很大的创新。
在我们转置和存储所有这些递归多分支树之后,我们形成一个索引文件。再看看,我们如何匹配这些索引文件?首先我们可以看到最左边有一个用户的头像,比如27岁,在倒排的列表里,下面有几个条目。这个时候我们27岁了,就可以对应匹配项a的命中加一操作了,同样对于男性用户头像这个属性,也可以对应匹配项a的命中加一操作,到了3,就可以触发所有索引项对应的广告了。
如你所见,第三代检索系统推出后,除了上述产品特性外,性能也有所提升。这些都是我们的一些性能指标,我们也有很多关键特性,比如广告在其生命周期内播放缓慢,启动缓慢,急刹车等。自从上线以来,我们的业务发展顺利。现在每天几千万,明年收入几亿。2015年底,我们发现技术面临新的挑战,这来自我们对人的洞察和分析。下面举个例子。比如一个产品经理,可能想在广告人群中找一些青铜成员,他们是活跃的用户,也是男性。他希望找到这些种子用户,并利用他们扩大类似的群体。如果数据量很小,比如几百万,那是个容易的问题,但是如果数据量特别大,比如几千万,甚至几十亿,几千亿,我们之前的方法就是写一大堆猪脚本来运行这个逻辑,但是这里有一个冲突,产品经理的需求很多变,广告商需要快速处理。当你写脚本或程序时,你需要程序员写代码,然后调试它们。这个过程很慢,会造成一些问题。面对这一挑战,我们通过分析和利用现有的检索技术基础进行了一些创新,开发了一个数据分析系统。
首先,我们对这个问题进行简化或抽象。这个数据分析问题可以分为四个步骤。第一,有原始数据集,灵活但或大或小。然后过滤数据集,提取子集,比如所有男性或者所有成员。然后对子集进行分组操作,再进行一些操作。
我们还为自己设置了一些系统设计约束。首先,它需要可扩展,因为我们面临的数据规模是可变的,从数百万到数千亿。然后是高性能,这是我们的技术能够产生价值的地方。如果能做到这一点,整个项目的运维成本就会降低。很好用,因为当时做核心系统开发的只有三个人,但是在需求端,我们有一百多个程序员在做数据相关的操作。因此,我们只需要三个人就可以处理一个100多人的开发团队,所以我们要求系统必须非常易于使用。
通过技术讨论和创新,我们选择了一个框架,很好地解决了所有这些约束。我们的架构是基于SSD硬盘的检索架构。SSD硬盘越来越便宜,但是也提供了非常高的带宽和延迟,所以SSD是介于内存和传统硬盘之间的一种中间状态。这是我们的系统架构。首先,系统分为全数据流和增量数据流,能够满足数据准确性和及时性的要求。
我们的指标分几块,比如1000块,多级聚合加速。我们提供毫秒级延迟,可以提供同步体验。以前用PIG的时候每个人可能要一天才能看到结果,现在我们可以用毫秒看到结果。我们的集群将有检索模块和聚合器模块。聚合器模块集成了Mysql Proxy,提供了极大的便利。对于检索系统,其核心设计元素是检索文件的布局。根据一些设计限制,我们选择了列存储。我们将单独存储所有的列,这可以为每个列提供更好的压缩。反向链选择RoaringBitmap,它可以在性能和空之间进行平衡。
前面说的是如何利用反演加快过滤过程,也就是如何利用反演从较大的数据集中提取较小的数据集。下一个问题是如何对较小的数据集进行分组。Group by有两个操作。我们研究了自己的情况,发现这两种方法都不是很适合。第一种方法,我们的系统是单列索引,没有联合索引的设计。因此,我们基于自己的数据结构开发了两种方法,包括用正向数据分组和用反向数据分组。对比分组性能,可以看出比原数据库算法好很多。
我们还提供了分区管理功能。例如,我们可以通过分析过去60天的数据,简单地删除60天后的数据。查询时,也可以检索当天对应的数据,而不是检索全部数据。还有有趣的插件函数,因为我们发现在PivotEngine的推广过程中有很多用sql语言无法满足的需求,我们设计了一个插件架构。
我们系统的核心设计目标是性能和存储成本。我们的系统性能比德鲁伊快一个数量级,存储成本大大降低。
以下是我的总结。我们做了很多建筑设计,从实际业务需求出发。我们部门本身就有一个特殊的技术生态,这也来源于我们的业务特点,因为整个部门就是一套架构。这就需要我们整个团队紧密合作,互相理解对方的代码。我们团队的代码能力很高,界面的可读性也很高。需求之一是技术生态系统。我们建立了许多基础设施来充分利用数据。此外,广告系统行业是一个技术密集型行业,技术可以促进产品的进步,对收入有影响。我们看到了一些关键的业务创新,比如兼容不同身份证的能力,这可以帮助我们整合各种广告产品和形式。这些产品级创新背后的驱动力来自于我们在技术上的积累和创新。
1.《全能广告 下一代的全能广告系统架构【腾讯创新日】》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《全能广告 下一代的全能广告系统架构【腾讯创新日】》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1249348.html