唐端荣|DSP投放引擎的设计与实现


640?wxfrom=5&wx_lazy=1

广告,即广而告之。广告的本质是传播,广告的灵魂是创意广告一词,据考证是一外来语。它首先源于拉丁文advertere,其意为注意,诱导,传播。中古英语时代(约公元1300—1475年),演变为Advertise,其含义衍化为“使某人注意到某件事”,或“通知别人某件事,以引起他人的注意”。直到17世纪末,英国开始进行大规模的商业活动。这时,广告一词便广泛地流行并被使用。此时的“广告”,已不单指一则广告,而指一系列的广告活动。静止的物的概念的名词Advertise,被赋予现代意义,转化成为“Advertising”。汉字的广告一词源于日本。

1890年以前,西方社会对广告较普遍认同的一种定义是:广告是有关商品或服务的新闻(News about product or service)。

1894年,Albert Lasher(美国现代广告之父)认为:广告是印刷形态的推销手段(Salesmanship in print,driven by a reason why)。这个定义含有在推销中劝服的意思。

广告背后的技术实现,也在日新月异的更新,广告技术专家唐端荣女士,做了很多深入的研究,从本文可略见一斑当代广告背后技术的实现


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

唐端荣女士在做分享


背景概述

众所周知广告是目前大部分互联网公司流量变现的主要手段,广告根据其目的可分为合约广告和效果广告两种形式;合约广告通常是指品牌广告,其目的是让更多的人知晓品牌、以创造良好的品牌形象为目的,以期用户记住品牌并在未来的时间产生线下转化。合约广告一般会提前做好排期,按CPM+频次控制的方式进行投放,触达用户数和投放到量即完成投放任务,在投放期间价格始终是固定的。效果广告的主要目的是在短时间内有明显的在线用户转化行为诉求,比如电商后续产生的购买行为,游戏后续产生的下载激活等行为,所以大多按CPC、CPA方式投放(也有按CPM投放但对点击率有硬性要求的投放方式);效果广告的特点是实时参与投放和实时竞价,并要求对投放效果实时反馈,以观察当前投放是否符合ROI要求,在投放期间价格会根据流量竞争的激烈程度产生波动,但价格上限可由广告主自行定义。

广告投放技术的更新由静态页面纯手工的替换,到系统自动按排期投放,再到现在的RTB实时交易等经历了三个阶段。这次我们要介绍的DSP(Demand Side Platform需求方平台)投放引擎,它处于RTB实时交易链中代表广告主利益的节点,是一种直接面向广告主的效果广告投放技术,它是以竞价或定价的方式,实现广告的受众购买和程序化购买,支持实时竞价和人群定向(DMP),同时具备对投放效果的实时监测、分析和优化能力。本文主要介绍DSP系统的架构设计和核心功能的实现的一些要点。DSP系统是程序化广告生态链中的一员,不可能脱离上下游系统独自存在,所以在进入正文之前,让我们先来了解一下程序化生态链中几个主要系统的角色和职能。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

程序化广告生态图

如上图所示,左侧代表广告主即流量采买方,右边代表媒体即流量供应商;中间的各种系统靠近哪方就是为哪方提供服务,从广告主角度来看:广告主在DSP平台发布广告投放任务;Ad Exchanges & SSP从媒体方采买流量,并将流量卖给DSP;DSP识别并挑选所需要流量参与竞价,胜出后完成一次投放;从媒体方角度来看,流量变现的方式有以下几种:1、将流量委托给Ad Network(在线广告联盟),Ad Network实际上是离线交易,对于广告主来说可以将广告触达更多的媒体;对于媒体方来讲可以将一部分卖不出去的流量变现;2、 将流量委托给第三方Ad Exchanges,Ad Exchanges可同时接入DSP和其它Ad Exchanges、Ad Network等,由Ad Exchanges进行比价后将流量给出价最高的广告主。3、将流量委托给SSP(Sell-Side Platform 媒体服务平台),SSP能智能的管理媒体广告位库存,区分优质流量和劣质流量,调度全站流量资源,将流量根据收益最大化原则,决定本次流量分配给品牌广告主、或将流量分发给Ad Exchanges、Ad network、DSP等,整体优化媒体方收入。 广告计费方式介绍广告投放的计费方式有如下4种:CPT:按时段计费,比如按天或者按小时买断某个广告位置。CPM:按千次曝光计费,将1000次曝光作为计价单位,计费公式:单次扣费 = CPM / 1000。CPC:按一次点击计费,计费公式: 单次扣费 =  CPC / CTR / 1000。CPA:按转化行为计费,比如下载、下单、注册等,计费公式:单次扣费 = CPA。随着投放技术的发展,逐渐摆脱由半人工的CPT的投放方式。目前较为普遍的是按CPM和CPC的方式进行投放。 DSP投放引擎设计思路
  •  高并发支持:广告请求量大,还要考虑效果数据收回产生的请求量,技术选型和架构设计时需要优先考虑性能问题;
  •  低延迟:Ad Exchage交易市场对广告返回有明确时长限制,一般为100ms,还要考虑网络耗时,所以程序运行时间加上GC时间,不允许高于50ms;
  •  满足各种定制化投放需求:支持广告主提出的各种定向支持,支持的定向条件越多,对检索速度和索引文件大小影响越式,设计时要考虑使用的算法同时兼顾需求和计算效率;
  •  支持灵活的AB实验:为持续优化CTR值,必须支持小流量实验,所以在不能影响正常业务运行的同时,要求支持动态、插拔式的算法实验;
  •  满足数据时效要求:数据时效考虑2点,1是指要实时响应广告主操作指令,比如暂停、调价、修改投放定向等;要实时呈现;2是投放效果报表实时呈现,满足广告主的投放效果实时反馈的需求。
  •  7*24小时服务:稳定性保证,服务单元在设计时,要避免单点问题;要求有多维度的监控手段,除了常规负载监控,增加业务级别的异常和预警机制,及设计可用的容灾和自动降级策略;
  •  AdExchanges的应答率标准:应答率会影响流量市场的派量算法,过低会被下调广告容量;与AdExchanges之间的通迅协议压缩,长连接支持。
  •  灾备和故障恢复:在线容灾,服务健康检查、自动功能降级、灰度发布、负载均衡;
  •  多维监控方案:软硬件监控、业务异常报警、投放线索追踪;
架构设计

DSP平台按功能可划分为四大服务单元:

1. Manager是广告管理平台,负责管理广告创意和投放设置、呈现投放效果报表,给广告主提供简单直观的操作界面。;

2. Adcenter投放中控机,负责创建索引,服务器心跳监测,同步投放数据和派帐、收帐等功能;

3. Adserver投放服务机,负责响应Ad Exchanges的广告请求和效果数据回收,对响应时间有严格要求,DMP为流量提供人群数据服务;

4. Algorithm算法服务集群,负责计算ctr和比价功能;Report负责提供实时和离线数据报表。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

DSP投放引分层图

业务分割原则:

1. 在线计算与离线计算分离,使用cache隔离。根据业务特点,区分在线与离线计算拆分到不同的服务单元。比如流量相关特征(地域、渠道、所属人群等)是通过在线计算得到的;广告的投放要求是已知的,那么根据广告投放要求生成正排和倒排索引就可通过离线计算得到;离线计算完成后的结果数据推送到cache中提供给在线计算使用。这种设计方式的优点是在高并发且数据量大的场景中,两者不会互相干扰,离线计算与在线计算不会互相抢占资源,提高实时计算的吞吐量;

2. 内网访问与外网访问分离。DSP业务中有扣费功能,会实时扣减消费金额,所以数据的安全性非常重要。出于保护数据安全性的目的,如上区分了在线计算与离线计算后,离线计算就不需要暴露在外网中,扣费操作可以转成离线计算走内网结算;而在线计算时仅与cache交互,不会透传到数据库。

3. 灵活的plugin机制。流量切分配置化,使用配置文件调度流量,将切分小流量用于AB实验;基于接口编程动态装配具体实现

4. 使用缓存隔离计算,将数据与计算分离,提升效率的同时保护数据安全; 根据数据时效要求和重要程度分为3级缓存,Heap:用于存储广告数据和在线反作弊数据;Redis-MS:用于存储广告数据和消费数据;Redis-Clustor:支持高并发,存储频控和DMP数据。

5. 节点去中心化:网络层使用VIP+LVS实现负载均衡,保证各服务器节点无状态;服务器增加业务级别的心跳监控和预警;单点服务增加Slave运行时互备,运行时互备使用分布式的租约锁,比如利用Redis SET key value EX seconds NX 特性(即只有键key不存在的时候才会设置key的值);当其中一台服务器失去续约能力时,备机将在很短的时间内拿到锁,继续提供服务。

重点功能实现 广告投放:我们先来看一下广告主新建一支广告后,用户在终端如何见到这支广告。如下图所示,从右往左看,广告主在DSP平台上创建广告后,API将通过内网实时同步给引擎;引擎得到数据后钝化到本地数据库,接着开始创建索引,索引完成写入cache并通知adserver更新广告数据。Adserver收到通知后去cahce取数据回来更新本地数据。从左往右看,用户终端发起广告请求先到AdExchange,AdExchage将请求下发给DSP的adserver,adserver从本地数据中计算得到本次要投放的广告,返回到AdExchage中参与竞价,胜出方返回给用户终端。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

广告投放过程以上是广告投放的完整过程,在这个过程中涉及到的节点有前置适配器、ABTest实验调度、广告检索、广告过滤、粗排、比价、后置适配器等。这里重点说一下广告索引构建和查找。我们使用BitMap代替原来的倒排索引,解决了数据量大时,广告定向维度多且维度值多的场景下,索引过大导致的性能问题,并且提升了检索速度,单次时长不超过1ms。具体实现如下: 索引构建:使用JDK原生BitSet+HashMap,Key为定向维度加维度值;value为BitSet,BitSet中的每1位代表1支广告,有当前维度定向值该位为1,否则为0。需要注意处理没有定向的维度,比如没有地域定向需要处理成全地域定向。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

索引结构 索引查找:根据流量特征取出相应数据,构建key从HashMap中取出符条件的BitSet,相同维度之间使用或(|),不同的定向维度之间使用与(&),计算出最终BitSet,这里需要注意Clone一份进行计算,切勿直接使用原生BitSet进行操作。根据BitSet结果对应的下标位上取出广告Id,完成检索。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

广告检索广告检索的效率很大程度上决定了广告响应的速度,所以我们在技术选型阶段做了3种方案的性能实验,最终选择了BitMap,结果也很符合预期。索引文件的大小不再是GC优化的瓶颈。 效果回收:从广告产生到、到投放出去、再到效果回来扣费完成一次交易。目前大多数流量市场是根据曝光来确认广告投放完成,也就是说在曝光时进行扣费。DSP则根据广告主设置的投放方式(CPM 或CPC)来决定是在曝光阶段扣费还是点击时扣费。在这个交易过程中,流量市场扣DSP的钱,而DSP扣广告主的钱。但凡是涉及到钱的,大多都重点强调精准,精准其实是包含二重意思,一是指扣费准确性,不允许有丢失或误扣;二是指防超投。我们重点讲一下如何实现精确扣费。 如何保证扣费准确性:1、系统的稳定性是大前提;2、是精度问题,将金额单位缩小1000倍进行计算。假设广告A按CPM投放,出价2元。当这个广告的曝光请求过来时,DSP要根据AdExchange返回的第二高价(假设为1元)进行本地扣减,本次扣减金额应该为1元/1000次=0.001元;假设我们操作的是一堆小数,那么将会有精度丢失导致的不必要损失。3、流水落本地磁盘,保障服务重启或异常时不会丢数据,等服务启动时load回来。4、单线程、异步队列,指将每一笔扣费数据推送队列中,另起线程进行扣费操作,避免影响主业务;扣费失败的数据重试3次后推送到Fail队列,Fail队列另起定时任务进行操作。5、本地数据库扣费原子操作。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1

除以上几点外,还要分清楚扣数和扣费,什么时候扣的是数,什么时候扣的钱。只要不涉及扣帐户的,都只能算扣数。比如某广告消费100元,但广告主帐上只有90元,那么实际扣费只能是90元。怎么能避免这种情况,引入下一个重点就是防超投。如何防止超投:首先了解一下超投是怎么产生的? 如上所说广告主只有90元预算,为什么会消费了100元呢?回顾一下上文中广告投放的过程,从广告投出后,要等到效果回来后才能扣减费用,也就是说在投放出去到效果回来的是有时间差的,在这期间广告仍然不停地投放,这样即使费用扣减为0停止投放了,但后续还陆陆续续有效果回来,而回来的这部分效果是没钱可扣的,这样就导致了消费超出了预算。这样说起来广告主还是赚了的,但对于DSP方来讲,尤其是流量大的时候,是非常不划算的,因为DSP是需要为这部分超投的流量向AdExchange付费的。目前应该还没有哪种方法彻底的解决超投问题,但仍有一些手段可以减少超投导致的损失:
  1. 1. 根据其投放方式和出价设置最小投放余额;
  2. 2. 设置默认流控阈值;
  3. 3. 当有历史数据时,参考上1分钟消耗设置流控阈值。
如果效阈值提高,可以有效减少超投甚至没有超投,但是会带来另一个问题:广告主帐户只余少量金额时无法消费,所以DSP在运营过程中需要将损耗比例作为成本考虑进去。 ECPM计算:指将CPM和CPC投放方式统一折算成ECPM后到流量市场参与竞价,ECPM计算中的主要元素是CTR预估,考虑到预估模型和特征数据更新频率,ECPM计算以微服务的形式提供支持,考虑服务治理与性能兼顾,我们选择了Dubbo, Timeout设置为50ms。CTR预估的主要目标是优化ROI,提高用户转化率和DSP收入。 出价公式:竞价ECPM(cpm) =  cpm 出价竞价ECPM(cpc)  =  cpc出价 × 1000 × ctr(预估) 扣费计算:扣费(cpm) =  ecpm2 (第二高价) / 1000扣费(cpc)  =  ecpm2 (第二高价)  / 1000 / ctr(预估)CTR预估的准确程度决定着DSP的盈亏。假设按CPC售卖,预估CTR高于实际CTR,DSP购买流量的成本高于广告主的消费,导致亏损;反之CTR估的过于低了有可能会买不到流量导致竞得率低。 监控手段
  1. 1. 硬件监控:监控服务器cpu、内存使用率、连接数、网卡流量,服务器负载等。
  2. 2. 软件监控:监控qps 、rt、jvm、队列大小、线程等。
  3. 3. 业务异常预警、内存数据可视化。
  4. 4. 业务数据监控
  5. 5. 线上问题快速响应,跟踪每支广告的投放情况。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

系统优化 640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1
研发总结

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


来源:中生代技术

原文链接


即将打开" "小程序
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值