Upload
micheal
View
183
Download
0
Embed Size (px)
DESCRIPTION
SOHU 精准广告投放系统. @DJ_ 戴军. 系统逻辑结构. Adserver. Adserver. 标签库. CTIndex. NetWork. 广告请求参数接收 & 获取. 获得 UA 与 PA. ADIndex. 根据请求参数从相应广告来源获得广告. AdExchange. CTR 模块. Ranking. Layout. AdServer 实现. 开发环境: Linux 开发语言: C++ 服务架构: nginx + fastcgi 模块间通信: thrift 本地缓存: redis 日志记录: log4cxx - PowerPoint PPT Presentation
Citation preview
SOHU 精准广告投放系统@DJ_ 戴军
系统逻辑结构
AdServer
MonitorServer
CookieMappingServer
系统逻辑结构
ADSERVER
Adserver
广告请求参数接收 & 获取
获得 UA 与 PA
根据请求参数从相应广告来源获得广告
ADIndex
标签库CTIndex
CTR 模块
NetWork
Ranking
Layout
AdExchange
AdServer 实现开发环境: Linux开发语言: C++服务架构: nginx + fastcgi 模块间通信: thrift本地缓存: redis日志记录: log4cxx服务运行方式:多进程多线程
AdServer 前端 http 请求接收 AdServer 的 http 请求接收层采用 nginx 搭建, nginx 接收到 http 请求后会将请求转发给后端的 fastcgi 服务。通过 GET 方式接收的参数:广告位 ID广告位尺寸轮播数通过 http 请求头接收的参数:用户 IP
UserAgent通过查表获得的参数:用户当前所在地域 ID( 可通过 nginx 配置实现 )注意: nginx 安装时要 --with-http_realip_module
AdServer 核心 AdServer 核心部分为使用 C++ 开发的多线程 fastcgi 进程。 FastCGI 像是一个常驻 (long-live) 型的 CGI ,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次 ( 这是 CGI 最为人诟病的 fork-and-execute 模式 ) 。它还支持分布式的运算 , 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
Use
r
fastcgi
Ngi
nx
fastcgi
fastcgi
fastcgi
AdServer 核心AdServer 的 fastcgi 进程利用 C++ 开发,采用固定线程数的多线程模型。
全局连接池 (index & ctr module)
线程 0接收 http 请求Popconn查询 indexPushconnPopconn查询 CTRPushconn排序输出
线程 1接收 http 请求Popconn查询 indexPushconnPopconn查询 CTRPushconn排序输出
线程 n接收 http 请求Popconn查询 indexPushconnPopconn查询 CTRPushconn排序输出
辅助线程Popconn ,关闭损坏连接,创建新的连接,Pushconn
待维修连接池
AdServer 与其他模块间通信AdServer 与 AdIndex 、 CTR 模块间通信采用 thrift 。 thrift 是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。 thrift 最初由 facebook 开发, 07 年四月开放源码, 08 年 5 月进入apache 孵化器。 thrift 允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成 RPC 客户端和服务器通信的无缝跨编程语言。
struct query_info {1: optional string adid,2: optional string score,3: optional i64 bid,
}
struct ret_info {1: optional string adid,2: optional double ecpm,3: optional string bucket,4: optional double ctr
}
struct CtrQuery {1: optional list<query_info> item,2: optional string adpid,3: optional string turn
}
struct CtrRet {1: optional map<string,ret_info>
eCPM_map,2: optional string adpid
}struct CtrQuery_list {
1: optional list<CtrQuery> query_list,2: optional string regionid,3: optional string browser,4: optional string os,
}struct CtrRet_list {
1: optional list<CtrRet> ret_list,2: optional string extdata
}
service CtrServ {CtrRet_list request(1: CtrQuery_list
req_info)}
thrift --gen cpp ctrserver.thrift
Thrift 服务端代码Thrift 官方网站:http://thrift.apache.org/
本地缓存 本地缓存采用 reids ,主要用于广告频次控制以及同一用户同一页面不同广告位之间广告去重逻辑的实现。频次控制:
1 、 monitor server 记录用户看过的广告2 、 AdServer 投放时读取用户当天看过的广告记录,去除达到频次控制 数的广告
去重控制:1 、 AdServer 以 MD5( 用户 ID+URL) 为 Key ,记录 5 秒内 Key 上投放的广告2 、 AdServer 以 MD5( 用户 ID+URL) 为 Key ,查询 5 秒内 Key 上记录的广告, 去除重复的广告
注意:本次作业不需要实现该功能
日志记录日志记录采用 log4cxx 库结合 logrotate 实现 .需要注意的问题:1 、多进程写同一个日志文件2 、 为什么用 logrotate 进行日志文件切割,而不用 log4cxx 进行日志切割 ?
注意:本次作业可选择实现该功能,若不实现该功能则运行方式改为单进程多线程
MONITORSERVER
统计服务器工作流程用户浏览器
统计服务器广告投放数据库
监测请求
监测日志
Storm
COOKIE MAPPING SERVER
Cookie Mapping Server工作方式
SOHU 为 cookie mapping 发起方 对方为 cookie
mapping 发起方
SOHU 为 cookie mapping 发起方Sohu.com 页面 第三方广告公司或广告主
Server(thirdparty.com)
Sohu Cookie Mapping Server(sohu.com)
Sohu 用户 ID
对方用户ID与用户
标签
记录日志 (Sohu 用户 ID,对方用户 ID,对方用户标签 )
标签转换
对方为 cookie mapping 发起方对方投放广告页面
(thirdparty.com)
Sohu Cookie Mapping Server
(sohu.com)
第三方广告公司或广告主Cookie mapping Server
(thirdparty.com)
对方用户 ID 与标签302跳转,sohu用户
ID
记录日志 (Sohu 用户 ID,对方用户 ID,对方用户标签 )
标签转换
Q&A
谢谢