什么是广告系统
广告是以“把合适的内容推送给合适的受众”为目的的商业交易过程,它同时为三种人群服务:第一种是广告主,即出钱购买广告的人,需要通过广告获取顾客;第二种是媒体,即提供投放平台以换取广告费收入的人,他们需要广告费实现流量变现;第三种是消费者,即在媒体上观看广告的人,他们希望能低成本地享受媒体给他带来的服务,接受在不反感的前提下获取广告,如果碰到刚好符合他们需求同时也高质量的广告,他们还乐意产生消费。
说到“把合适的内容推送给合适的受众”,你可能很容易联想到个性化推荐,那是不是一定具备个性化推荐技术才能构造广告系统呢?其实也不一定,比如一些垂直类的媒体本身就可以代表其用户属性,比如,你可以通过标签匹配,把奶粉广告投放到妈妈社区,考试辅导班广告投放到学生论坛,也能达到一个不错的效果。不过如今随着推荐系统门槛的降低,个性化推荐已成了广告系统的主流手段。
广告系统的组成
我们现在想想一个广告系统所需要的最基础的组成部分,首先需要能够投放广告与展现广告:
广告物料库(Ad Inventory):广告主根据系统要求提供的广告素材,比如图片和文案等,通过广告主后台进行投放
广告投放系统(Ad Serving System):接受前端广告位的请求,计算出最适合的广告并返回给前端
但是,广告肯定不能免费投放的,因此,广告系统需要跟广告主进行费用统计和收费。在线广告的收费方式通常有以下几种:
CPM(Cost Per Mille):按千次展示收费,广告被浏览1000人次产生一笔费用。
CPC(Cost Per Click):按点击收费,广告被用户点击一次产生一笔费用。
CPA(Cost Per Action):按用户行为收费,比如用户点击广告之后进行了一次应用下载/网站注册后产生一笔费用
CPS(Cost Per Sale):按销售额收费,对广告引导的商品销售额进行一定比例的提成。
加上收费功能后,广告系统就应该增加以下部分:
广告计费系统:根据广告位投放情况的反馈以及收费类型,进行计费统计,若当天产生的费用已经达到广告主设定的预算,则需要通知投放系统进行广告下线,这样既避免广告主预算超标,也避免流量被浪费。
广告结算系统:根据计费系统产生的数据进行费用账单,并由广告主进行缴费。
广告系统的技术要求
投放系统:响应时间
一个典型的广告投放系统主要由三个部分组成:索引、CTR模块、投放服务。其中投放服务处理前端传过来的请求,把请求转化为查询条件到索引中进行检索,再把检索结果通过CTR模块进行排序(Ranking),最后数据最终结果并记录投放日志。其中,CTR模块根据实时计算的eCPM对广告检索结果进行从大到小的排序。
关于eCPM:全称expected cost per mile,意思是每进行一千次投放的预期收入。具体计算方法为eCPM = CTR(点击率) * bid(出价),CTR可以理解为用户点击该广告的概率,因此CTR与bid相乘就是这一次投放的预期收入,广告业务希望收入最大化,因此CTR的计算就是核心中的核心。
对任何To C的服务来说,响应时间都是最重要的技术指标,对于一个广告投放系统尤为如此。因为媒体数量会不断增长,因此广告投放系统是具有高并发、低延迟的特点。常规的分布式Web系统架构都可以应用在上面,另外通常还会使用提高检索效率的Lucene相关组件(如Solr或ElasticSearch等)作为索引部分。
计费系统:数据实时
计费系统的构成不会特别复杂,它是前端广告位与投放系统之间的桥梁,核心任务是保证广告投放在预算范围之内,尽可能地避免发生超投——即广告投放的次数与相应费用超出广告主预设的范围。
为了保证这一点,我们要求计费系统应重点保证数据的实时性,具体环节包括广告位展示信息的埋点数据收集、处理与费用计算等。从用户查看或点击一次广告到进行广告下线反馈,这一过程应保持分钟级以内的延迟。由于广告位曝光或用户点击行为的数据量相当庞大,目前流行的方案是使用Kafka提供日志消息分发。
聪明的你可能会发现,对于CPC广告来说,即使计费系统及时发出下线反馈,但那些已经投放出去、尚未产生点击的广告仍然会可能产生超投。因此超投只能控制在一定范围之内,并不能完全杜绝。广告系统到达一定规模、超投率超出可以接受的范围之后,计费系统应具备预测消耗的能力,即每进行一次投放,计费系统预测出可能产生的费用,并提前进行费用计算、对预测预算将被耗尽的广告计划在点击尚未发生之前就先进行下线操作(笔者曾经翻译过一篇文章,介绍Pinterest广告团队如何构建消耗预测系统,感兴趣的话可查看这里)。另外,对预算将近的广告计划,投放系统也应该降低投放频率,使预算极可能平滑地达到上限。
结算系统:数据准确
结算系统与计费系统虽然都提供了费用计算的功能,但侧重点不同。结算系统提供的是广告平台与广告主之间费用结算服务,关注的是数据准确度;而计费系统则重点关注的是计费实时性,其根本目标是保证流量的有效利用。
结算系统一般会以离线数据为基础进行计算,首先,这样可以以较少的成本保证数据完整性,因为如果像计费系统那样一来实时流计算,就不可避免地要面临服务可用性问题。如上文所说,假如流计算服务宕机,对计费系统来说最多也就是造成流量的浪费,但对结算系统来说,则意味着广告平台利益的无辜损失。其次,广告结算系统通常会引入“反作弊”的功能(比如一个用户短时间内多次点击,只收取一次点击的费用),基于离线数据,便于引入更先进(可能也意味着耗时更高,这与计费系统的要求相悖)的反作弊算法,以保障广告主的权益。
总结
* 广告系统的目标是“把合适的内容推送给合适的受众”
* 广告系统的核心部分由投放、计费、结算三个子系统组成
* 投放、计费、计算系统各自的技术关注点不同:投放系统关注请求响应时间,计费系统关注数据实时性,结算系统关注数据准确性