Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Golang与高性能DSP竞价系统
Zoom.Quiet
December 04, 2013
Technology
2
2.9k
Golang与高性能DSP竞价系统
珠三角技术沙龙广州11月Golang专场回顾 | TechParty:珠三角技术沙龙 | 打造泛珠三角技术圈线上线下交流的平台
http://techparty.org/2013-12/golang/
Zoom.Quiet
December 04, 2013
Tweet
Share
More Decks by Zoom.Quiet
See All by Zoom.Quiet
PyCon2014China-Zhuhai-high performance
zoomquiet
0
110
PyCon2014China-Zhuhai-meta programming
zoomquiet
1
75
PyCon2014China-Zhuhai-bpm.py
zoomquiet
0
49
PyCon2014China-Zhuhai-luna kv db
zoomquiet
0
29
PyCon2014China-Zhuhai-seed studio
zoomquiet
0
24
PyCon2014China-Zhuhai-Docker Registry Build By Python
zoomquiet
0
27
PyCon2014China-Zhuhai-jeff
zoomquiet
0
28
PyCon2014China-Zhuhai-pythonic front-end
zoomquiet
0
37
DevFest2014-Zhuhai-Polymer
zoomquiet
0
210
Other Decks in Technology
See All in Technology
AWS CLI入門_20220513
suzakiyoshito
0
3.7k
完全に理解した incremetal 〜そして、何もわからないへ〜
mashiike
0
210
LINEのData Platform室が実践する大規模分散環境のCapacity Planning
line_developers
PRO
0
270
Who owns the Service Level?
chaspy
5
810
msal.jsのあれこれ
takas0522
0
1.5k
アルプの 認証/認可分離戦略と手法
ma2k8
PRO
1
260
AWSの基礎を学ぼうで学んだ9種類のDBを勝手にふりかえる
98lerr
2
720
~スタートアップの人たちに捧ぐ~ 監視再入門 in AWS
track3jyo
PRO
31
8.6k
街じゅうを"駅前化"する電動マイクロモビリティのシェアサービス「LUUP」のIoTとSRE
0gm
1
520
実験!カオスエンジニアリング / How to Chaos Engineering
oracle4engineer
PRO
0
140
THETA Xの登場はジオ業界を変えるか?
furuhashilab
0
160
如何使用 Argo Event& Workflow 快速建置自定義的工作流程 @ #CNTUG #47
line_developers_tw
PRO
0
6.5k
Featured
See All Featured
For a Future-Friendly Web
brad_frost
164
7.4k
4 Signs Your Business is Dying
shpigford
169
20k
GitHub's CSS Performance
jonrohan
1020
410k
In The Pink: A Labor of Love
frogandcode
130
21k
Faster Mobile Websites
deanohume
294
28k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
100
5.9k
The Mythical Team-Month
searls
208
39k
Why Our Code Smells
bkeepers
PRO
324
54k
Visualization
eitanlees
124
11k
Writing Fast Ruby
sferik
612
57k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
498
130k
Designing for humans not robots
tammielis
241
23k
Transcript
专业DSP解决方案供应商 Golang与高性能DSP竞价系统 By @QLeelulu
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• RTB: Real Time Bidding,实时竞价,允许广告买家根 据活动目标、目标人群以及费用门槛等因素对每一个广 告及每次广告展示的费用进行竞价。 • DSP: Demand Side Platform,需求方平台,允许广告 客户和广告机构更方便地访问,以及更有效地购买广告 库存,因为该平台汇集了各种广告交易平台的库存。 什么是RTB与DSP
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
什么是RTB与DSP
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
什么是RTB与DSP
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 高并发量请求处理 • 每天几十亿竞价请求 • 每个竞价请求要在80毫秒内响应(包含网络延迟) • 复杂的出价逻辑 DSP竞价系统的挑战
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 竞价请求解析(JSON 或 Google Protobuf) • 根据广告位属性过滤活动 • 根据客户端信息过滤活动(浏览器、操作系统类型等) • 根据地区过滤活动 • 查询Cookie Mapping得到访客在DSP系统的唯一ID • 根据用户看过广告的频次过滤活动 • 根据访客的人群属性过滤活动 • 根据活动的出价选择胜出的活动 • 其他更细致的过滤条件 80毫秒内要做些什么
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved 为什么选择Golang
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 2012-11-29 • 在 Go 1.1 发布之后 第一次签入
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• http包的HelloWorld性能测试 为什么选择Golang Via: http://www.cnblogs.com/QLeelulu/archive/2012/08/12/2635261.html
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 高性能、天生并发支持 • 性能敏感的模块可以直接使用C编写 • 编译为本地机器码,部署方便 • 快速上手,学习成本低 • 标准库基本够用 • 带GC • 自带单元测试、性能测试、性能分析工具 • 开发效率不低 为什么选择Golang
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• C++ • NodeJS • Golang ☑ 备选
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved 竞价接口
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 直接用golang的http包 • 只使用gorilla/mux做简单的请求路由 • 封装简单的HTTPBaseHandler HTTP竞价接口
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
简单的HTTPBaseHandler
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 统计竞价请求数(准实时) • 导入广告位信息 • 其他数据分析需求 日志处理
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 缓存 • 按天分割 日志处理: 写入
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• Tail –f • github.com/ActiveState/tail 日志处理: 读取与分析 t, err := tail.TailFile(“/var/log/nginx.log”, tail.Config{Follow: true}) for line := range t.Lines { fmt.Println(line.Text) }
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 并行处理多个日志文件 日志处理: 读取与分析
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 目前单机每天写入300G • 处理结果接近实时 日志处理
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 重度使用Redis • 存放的数据包括 • CookieMapping(一个ADX会超过10亿个key) • 曝光频次 • DMP人群数据 • 实时费用消耗 • 其他 Redis集群
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• Server端:等待Redis官方 • Proxy中间代理:twemproxy,维护方便,有一定的性 能消耗 • Client端:配置、维护麻烦,几乎无性能损耗 Redis集群
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 最终在Client端实现 • 一致性hash: github.com/mncaudill/ketama • 预先开启足够多的Redis实例,预防增加节点带来的数据 迁移麻烦 Redis集群
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 15台机器 • 100个Redis实例 • 占用500G内存 • 峰值QPS在20万 Redis集群
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 组合多个命令一起发送(非事务) Redis Pipeline
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• Go不支持以后台进程的方式启动 • 使用Supervise来管理进程 部署:进程管理
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 独立部署 • 方便更新与重启 把服务划分为独立的进程 ./bin ├── adx_mod ├── analysis ├── bid ├── charge ├── convrate_import ├── cookie_map ├── dispatch ├── ip_import ├── kpicharge ├── pdmp └── whisky
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• ulimit • fs.file-max = 800000 • net.nf_conntrack_max = 4194304 • net.ipv4.tcp_max_tw_buckets = 4194304 • tcp_max_syn_backlog = 500000 • sysctl.conf 其他调优 部署:高并发服务器调优
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• Nginx做前端 • 开多个Go进程 • Nginx的upstream做负载均衡 部署:web服务器 Nginx Go竞价服务 Go竞价服务 Go竞价服务
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 使用DNSPod的创业版收费套餐 • 速度快、稳定 • 解析生效快 部署:DNS级别负载均衡
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 三个人(Golang部分) • 三个多月 第一版正式上线
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 12台竞价服务器,CPU为8核16线程 • 每天40亿+竞价请求 • 峰值8万QPS • 98%响应在10ms以内 • 大半年以来无异常,稳定 线上运行情况
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 响应时间超过80毫秒则为超时 • 差不多达到1%的超时率,峰值时达到2% • 哪里出问题?网络? 超时率
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• Nginx日志打印响应时间: $request_time • 发现不少超过80毫秒的状态为499的日志 • POST /bid HTTP/1.0 – "499" - "81" • 确定非网络原因 超时率
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 打印GC时间: GOGCTRACE=1 • 下面的日志是QPS在2000的时候 GC gc69(8): 0+88+11 ms, 558 -> 280 MB 2906842 -> 91459 (154792586-154701127) objects 注:有260MB的IP数据加载到内存中,所以进程占用内存比较大
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
1. Stop The World 2. Mark 3. Sweep 4. Clean 5. Start The World Go的GC是怎么工作的 GC时会停止一切工作!
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 默认 GOGC=100 : 内存翻倍时 • 2分钟一次强制GC 触发GC的条件
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• IP查询使用Redis,进程占用内存10M 另一个GC数据 gc34(8): 2+1+1 ms, 20 -> 10 MB 145803 -> 40344 (2963013-2922669) objects GC在5ms以内,但是GC间隔变短,因为内存很快就由10M涨到20M
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 开发时尽量注意自己考虑内存管理的问题 • 等待官方更加给力的GC 坑,怎么办?
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 每天2亿+曝光 • 每个曝光2个请求,每天4亿+请求 • 实时计算、实时写入MySQL 曝光统计服务
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
曝光统计服务 HTTP接口, Go服务 日志 Redis队列 Transfer, 计算并生成SQL SQL Redis队列 MysQL数据库 读取SQL 写入MysQL
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• 应届毕业生 • 一个人 • 三个星期 • 接近一万行代码 • 性能提升7倍 • 部署、维护更方便 Golang重写原来PHP的Transfer
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
回馈社区 • 第三方包会有一些小坑
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• go get github.com/sdegutis/go.assert • import “github.com/sdegutis/go.assert” 包管理
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
• URL地址变更 • 无版本管理 包管理
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
代码管理与自动化测试: Gitlab
专业DSP解决方案 © 广州舜飞信息科技有限公司 All Right ReservedAll Right Reserved
代码管理与自动化测试:Gitlab-CI
网络运营全流程解决方案供应商 Q&A Thanks! 欢迎加入我们!