在线广告系统架构变迁

Overview

(未完)

广告按业务划分有以下几类:

  1. 展示广告(Banner广告)
  2. 搜索广告(关键词广告)

按计费模式有:

  1. CPT: 按有效广告展示天数计费,可定价或竞价;
  2. CPM: 按有效广告展现次数计费,可定价或竞价;
  3. CPC: 按有效点击次数计费;
  4. CPS: 按效果计费,如,按成交订单额,按流量带来的有效下载或安装次数计费;

广告系统按结构可划分为以下子系统:

  1. 广告投送服务器
  2. 广告数据库及业务系统
  3. 用户行为跟踪系统
  4. 日志传输系统
  5. 流式数据分析和计算平台
  6. 离线数据分析和计算平台

从展示广告到搜索广告再到社会化广告

早期的互联网广告以展示广告为主,业务模式和在报纸,期刊上刊登广告相似,广告主按其广告的展现次数或时长来付费。直到1998年有个叫GoTo的公司(后公司改名为Overture,2005年被Yahoo收购)开始提供关键词广告,这是一种简单高效的定向广告,广告主可以按与其业务相关的关键词购买搜索流量,按访客的点击计费,和早期的展示广告相比这无疑是一个巨大的进步,通过关键词将用户和广告关联起来,而不是在广告位上一直展现同样的广告或随机的展现。随后Google迅速的采用了这个方法将自身的搜索流量变现,并不断优化和壮大,最终形成了Google的Adword产品,早期Google并不为搜索用户建立个性化数据,因此可用于定向的数据比较有限,于是Google又推出了AdSense产品,将触角伸向了全网,通过AdSense的合作网站,Google可以采集到访客在这些网站的访问足迹,并利用这些数据提高其广告的相关性;随着以Facebook为代表的社交网络的兴起,这些网站有个特点就是自身就具备了比较完善的用户个性化数据,利用这些数据,网站可以将定向技术使用到展示广告,这使展示广告迎来了第二春,广告产业对数据的应用价值有了极大的兴趣,也催化了大数据的技术广泛应用。近年来一种新的广告业务模式–“实时竞价广告交易系统”也逐渐被网站主和广告主接受,其核心目的是让每次广告展现都创造出尽可能多的回报,以自动化的方式系统使用实时数据和竞价信息将广告空间分配给那一时刻出价最高的销售渠道。

广告系统的架构变迁

早期的展示广告系统因为业务数据量不大,广告位按时长售卖。系统架构上比较简单。系统核心为关系数据库,广告主通过业务系统管理广告数据:账户设置,广告计划,预算,推广单元,广告创意等;通过审核后可以投放的数据进入广告投放服务器。简单的广告系统可以完全围绕数据库来实现。投放服务器直接访问数据库获取需要投放的广告数据,并通过缓存来提高性能,减少对数据库的压力。

图[简单的广告系统架构]

当广告系统里的广告主越来越多,广告位的流量越来越大,直接访问数据库的做法不能满足性能和扩展性的要求,主要原因是传统的关系数据库的设计目标是通用的需求。这种情况下广告系统可以定时将广告数据从数据库中导出,生成的数据文件通过网络传到投放服务器,投放服务器将数据文件载入内存供快速访问,当用户打开网站页面时候,部署在广告位的代码(可部署在客户端或服务器端)将参数传给广告投放服务器,投放服务器按一定策略和逻辑取出需要展现给用户的广告数据,按接口规范直接返回给用户浏览器渲染,或返回给调用广告引擎的服务器端程序,再由服务器端程序将广告嵌入内容页面。

图[改进后的简单的广告系统架构]

对于大多数中小网站,广告是其运营收入重要的一部分,在网站上部署广告一般有下面几种方法:

接入大型广告网络

这是最简单的一种方式,不占用网站的服务器资源,只需要在网站广告位嵌入广告网络提供的广告代码即可。

Google AdSense

Google AdSense 是一种获取收入的快速简便的方法,适合于各种规模的网站发布商。它可以在网站的内容网页上展示相关性较高的 Google广告,并且这些广告不会过分夸张醒目。由于这些所展示的广告内容同用户在您的网站上查找的内容相关,因此,最终您的内容网页不仅仅会为您带来很好的经济效益,还能够得以充实网站内容页面。google根据网站上显示的广告被点击的次数支付佣金,当某个月底佣金累计达到100美元时即可向发布商支付广告佣金。

Google AdSense开创了一个新的广告模式吧。以前的很多广告商,主要靠在各种页面,高频率的轰炸网友的眼球,而不管这个网友对广告内容是不是感兴趣。但是AdSense却通过分析网页内容后,提供一些和内容相关的文字广告(也会有个别图片广告),因为内容相关的广告更容易引起读者的兴趣,使广告成为一种真正有用的信息,而且也不会给网友太多的骚扰。

阿里妈妈

阿里妈妈是阿里巴巴集团旗下的网站联盟,将网站主与淘宝卖家之间搭起了一座桥梁,依托自身强大的技术研发能力,对商品实现今精准投放,不断改进投放内容与形式,让双方利益都得到最大化,营造了一个良性循环的生态圈。

百度联盟

百度联盟隶属于全球最大的中文搜索引擎百度。一直致力于帮助合作伙伴挖掘互联网流量的媒体价值,帮助推广客户拓展精准有效的投放通路,是现今国内颇具规模的广告联盟。

使用第三方广告托管系统

使用第三方广告托管系统相对于接入一个广告网络相比还可以展现自身的广告。

百度广告管家

百度广告管家是在线媒体广告管理系统,提供了广告投放管理、收益优化、定向投放、广告托管、广告数据统计报告等功能,几乎涵盖了目前所有网站站长的广告管理需求。登录百度广告管家,看到广告投放管理可以支持对固定、弹窗、漂浮三种类型的广告位投放的管理操作,并支持提供按地域、接入方式、日期、浏览器、浏览器语言、操作系统、来源域、分辨率、被访URL等定向投放方式的管理。广告计费方式提供按日、按展现、按点击三大主流计费方式。

部署开源广告系统

通过部署开源的广告系统可以对广告投放有较大的控制权,但为此需要消耗带宽和服务器成本,以及广告系统二次开发和维护成本。

OpenX

OpenX是一个用PHP开发的开源广告管理与跟踪系统,适合各类网站使用,能够管理每个广告主拥有的多种任何尺寸横幅广告,按天查看,详细和概要统计并通过电子邮件发送报表给广告主。

自主开发

大型的互联网公司一般会选择自主开发广告系统与自身业务相结合,如百度,淘宝。也有一些独立的广告联盟或新创的广告公司(如在无线广告领域)会选择自主开发。

广告系统模块

广告投放服务器

广告投放服务器的规模是和流量以及广告数据量成正比的。当广告数据规模较小时,一台服务器的内存就能放下所有数据,如果同时这台服务器也能承担所有广告请求流量,那投放系统就能简化到一台机器;如果一台服务器不能承担所有流量,那么可以复制出同样的多台服务器共同承担广告请求流量,并在这个集群前使用负载均衡设备将流量均匀的分配给集群内的服务器;如果数据量太大以致于单机存不下所有数据,那么可以将广告数据按一定维度分区,存在一组服务器上,这组服务器提供不同分区的访问,对外则通过统一的接口供访问,调用者首先根据分区维度的参数值确定该分区的服务器,再向该服务器直接调用。

随着软硬件的不断升级和优化,现代的普通商用服务器单台每秒可处理几千次的广告请求。在实现上选用高性能的Web服务器,如Nginx或Lighttpd,可以支撑大量并发连接,降低处理每个广告请求的系统消耗。如果对性能的有极端的要求,有些广告系统甚至会自主开发Web服务器(如采用Erlang,C语言等),或裁剪通用开源Web服务器不需要的功能,而只保留核心功能。

K/V内存数据库

广告投放服务器对性能要求非常高,从收到广告请求到返回广告数据只有十几毫秒的时间完成决策和数据封装,而数据在内存中的读取速度相对最快,所以在广告投放服务器中,需要投放的广告数据都会保存在基于K/V的内存数据库中供快速读取。内存数据库和关系数据库中的数据通过消息队列保持同步,开源的K/V数据库有Memcache和Redis等。

关系数据库

广告系统需要采用关系数据库来存储结构化的数据,如:广告计划,推广单元,创意等。这些是至关重要的核心数据,对数据安全性要求很高,要求即使在出现硬件损坏的情况下,客户的数据仍然能保证完整。业界一般采用两种方法存储这些核心数据:采用商业关系数据库如:Oracle,或采用开源数据库如:Mysql或Postgresql。商业数据库功能完善,但价格往往不菲,当广告系统规模变大后,成比例上升的软件成本不可小觑,所以会逐渐转向采用开源的Mysql,其高可用性则通过多个集群及实时复制技术来保证。

在广告系统中对广告数据的管理会通过一个或多个基于Web的应用来实现。通常采用J2EE或LAMP开发框架来开发。随着互联网广告的广泛和深入使用,广告的业务系统功能也越来越多且复杂,从架构上广告业务系统也朝着服务化和开放方向发展。

消息中间件

广告数据在关系数据库的更新需要反应到投放服务器中的内存数据库,从而更新访客看到的广告。一般来说广告主对数据同步的延迟是有一定要求的,现代的广告系统也越来越往实时同步方向发展。

CDN

对于带有图片或视频等富媒体内容的广告创意,为了让访客的浏览器能较快的下载广告内容,需要将这些内容文件放在离访客地理位置较近的服务器上,这正是CDN系统的优势,广告系统往往需要租用或自己搭建CDN系统。

RPC框架

大型广告系统在实现服务化后,需要进行分布式通信的服务器越来越多,采用较好的RPC框架,可使得系统各个模块之间的通信方法标准化, 简化业务开发。

介绍一下Facebook开源的Thrift框架。Thrift是一种高效的、支持多种编程语言的远程服务调用的框架。互联网上比较流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。Thrift则采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。

流式分布式计算平台

Storm是Twitter开源出来的实时计算框架。可用于广告的防作弊,过滤无效展现PV和点击,也可用于实时广告费用结算等业务。

离线分布式计算平台

大型广告平台的数据量非常大,受众用户和网页都在亿级,广告量级在百万,而且数据之间还有各种关联关系,必须能通过一个分布式计算平台才能处理。Hadoop是Apache开源组织的一个大数据分布式计算框架,在很多大型网站上都已经得到了广泛的应用:如Amazon,Facebook和Yahoo,国内的阿里巴巴也建有节点超过千台的Hadoop集群,用于淘宝,支付宝,阿里金融等业务数据的分析。广告系统可以利用Hadoop分析广告展现日志和点击日志,计算每个广告在一定时间跨度内的展现量,点击量,有效展现,有效点击,平均点击消耗费用,转化率等广告主报表数据;有很多的算法计算都可以采用Hadoop平台来实现。Hadoop的核心思想是Map/Reduce模型,其计算流程类似于Unix的Pipe:

input | map | shuffle & sort | reduce | output

在Hadoop之上有Hive,Pig等简易数据分析接口,还有类Google Bigtable的开源实现HBase–高可靠、高性能、面向列、可伸缩的分布式存储系统。