珠三角技术沙龙广州11月Golang专场回顾 | TechParty:珠三角技术沙龙 | 打造泛珠三角技术圈线上线下交流的平台 http://techparty.org/2013-12/golang/
专业DSP解决方案供应商 Golang与高性能DSP竞价系统 By @QLeelulu
View Slide
专业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 • 高并发量请求处理 • 每天几十亿竞价请求 • 每个竞价请求要在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) objectsGC在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! 欢迎加入我们!