168大数据

标题: 基于Kafka Streams构建广告消耗预测系统 [打印本页]

作者: 168主编    时间: 2017-11-10 14:26
标题: 基于Kafka Streams构建广告消耗预测系统

Pinterest 广告工程团队的宗旨是为我们的广告合作商提供最优质的服务体验,而广告超投,是我们极力要解决的问题之一。在Pinterest,我们使用了 Kafka Streams ,可以实现把广告消耗的预测数据在数秒钟的时间内发送给数千个广告投放服务。本文将会先解释什么是超投,然后分享一下我们是如何使用 Kafka Streams 构造预测系统来提供近实时的预测消耗数据、从而降低超投的。

关于超投

当广告主的预算耗尽时,如果他们的广告被继续投放,这多出来的投放部分将无法再进行收费,这种现象被称之为超投。超投会减少其他还有预算盈余的广告主的广告展现机会,从而降低了他们的产品和服务触及潜在顾客的机会。

要降低超投率,应从两个方面着手:

我们举个例子来详细说明一下。假设有一个能提供广告投放的互联网公司,广告主X向该公司购买了出价为$0.10元/曝光 、预算为$100元/天的广告服务。这意味着该广告每天最多曝光1000次。

该公司为广告主快速实现了一个简单明了的投放系统:

当网站上出现新的广告展现机会时,前端会向广告库(ad inventory)请求一条广告。广告库根据广告主X的剩余预算来决定是否投放他们的广告。如果预算仍然充足,广告库将通知前端进行一次广告投放(比如在用户端APP的一个广告位上展示出来)。当用户浏览了该广告后,一个曝光事件会发往计费系统。

然而,当该公司检查他们的收入时,发现事情的进展与预想的并不一样。

广告主X的广告实际展示了1100次,由于预算只有$100,因此平均每次曝光的价格实际只有$0.09元。比计划多出来的100次曝光相当于是免费投放了,而且这些曝光机会本来可以用来展示其他广告主的广告。这就是业界常谈的超投问题。

那么为什么会发生超投?在这个例子中,我们假设是由于结算系统的响应时间太长所导致的。假设系统对一次曝光的处理有5分钟的延迟,从而导致了超投。因此,这个互联网公司采取了一些优化手段来提高了系统性能,结果成功地多赚了$9元!因为它把原本100次无效曝光中的90次让给了其他预算充足的广告主,从而把超投率降低到10/1000 = 1%。

不久之后,另一位广告主Y也联系了这家公司,并希望以$100元/天的预算、$2.0元/点击(例如,一个用户通过点击广告链接到达广告主Y自己的网站)、最多每天50次点击的价格购买广告。这家公司把广告主Y加到他们的广告投放流程里,并在他们的系统增加了点击事件的跟踪。

一天下来,这家公司的广告系统再次发生了超投。

结算下来,广告主Y竟然得到了10个免费点击!而这家互联网公司发现,即使结算系统处理速度足够快,但却无法预知一个投放出去的广告是否会被点击,由于缺乏这些未来的消耗信息,超投将永远都无法避免。

本例子中的主人公最后找到了一个非常聪明的解决办法:给每个广告主计算预测消耗。预测消耗指的是已经投放出去了但尚未发生消耗的那部分。如果实际消耗+预测消耗>每日预算,则停止该广告主的广告投放

构建预测系统初衷

我们的用户每天在Pinterest上进行浏览以获取新的灵感:从个性化推荐,到搜索,再到运营推荐位。我们需要构建一个兼具可靠性和可扩展性的广告系统来进行广告投放,并确保利用好我们广告主的每一笔预算。

需求

我们着手设计了一个消耗预测系统,系统目标如下:

为什么选择Kafka Streams

我们评估过不同类型的流式服务,其中也包括 Spark 和 Flink 。这些技术在数据规模上都能满足我们的要求,但对我们来说,Kafka Streams还具备了一些特殊的优势:

具体实施

下图在高层次上展示了加入了消耗预测之后的系统结构:

在实际应用中,我们的消耗预测的准确率非常高。在整个预算预测系统上线之后,我们的超投率明显下降了。下图是我们的实际消耗与预测消耗的一个对比测试结果样例。

说明:图中的横轴是以3分钟为单位的时间轴;纵轴表示单位时间内的消耗。其中蓝线表示预测消耗,绿线表示实际消耗

一些经验结论

使用Apache Kafka Streams来构建预测消耗系统是我们广告基础组件的一个新的尝试,而该系统也达到了高效、稳定、高容错与可扩展的要求。我们计划在未来将会持续探索由Confluent推出的 Kafka 1.0 和 KSQL 并应用到系统设计上。

转载请注明出处乐投网





欢迎光临 168大数据 (http://www.bi168.cn/) Powered by Discuz! X3.2