Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Golang与高性能DSP竞价系统

Zoom.Quiet
December 04, 2013

 Golang与高性能DSP竞价系统

珠三角技术沙龙广州11月Golang专场回顾 | TechParty:珠三角技术沙龙 | 打造泛珠三角技术圈线上线下交流的平台
http://techparty.org/2013-12/golang/

Zoom.Quiet

December 04, 2013
Tweet

More Decks by Zoom.Quiet

Other Decks in Technology

Transcript

  1. 专业DSP解决方案供应商  
    Golang与高性能DSP竞价系统

    By  @QLeelulu

    View full-size slide

  2. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  RTB:  Real  Time  Bidding,实时竞价,允许广告买家根
    据活动目标、目标人群以及费用门槛等因素对每一个广
    告及每次广告展示的费用进行竞价。  
    •  DSP:  Demand  Side  Platform,需求方平台,允许广告
    客户和广告机构更方便地访问,以及更有效地购买广告
    库存,因为该平台汇集了各种广告交易平台的库存。  
    什么是RTB与DSP  

    View full-size slide

  3. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    什么是RTB与DSP  

    View full-size slide

  4. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    什么是RTB与DSP  

    View full-size slide

  5. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  高并发量请求处理  
    •  每天几十亿竞价请求  
    •  每个竞价请求要在80毫秒内响应(包含网络延迟)  
    •  复杂的出价逻辑  
    DSP竞价系统的挑战  

    View full-size slide

  6. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  竞价请求解析(JSON  或  Google  Protobuf)  
    •  根据广告位属性过滤活动  
    •  根据客户端信息过滤活动(浏览器、操作系统类型等)  
    •  根据地区过滤活动  
    •  查询Cookie  Mapping得到访客在DSP系统的唯一ID  
    •  根据用户看过广告的频次过滤活动  
    •  根据访客的人群属性过滤活动  
    •  根据活动的出价选择胜出的活动  
    •  其他更细致的过滤条件  
    80毫秒内要做些什么  

    View full-size slide

  7. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll Right Reserved
    为什么选择Golang

    View full-size slide

  8. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  2012-11-29  
    •  在  Go  1.1  发布之后  
    第一次签入  

    View full-size slide

  9. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  http包的HelloWorld性能测试  
    为什么选择Golang  
    Via: http://www.cnblogs.com/QLeelulu/archive/2012/08/12/2635261.html

    View full-size slide

  10. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  高性能、天生并发支持  
    •  性能敏感的模块可以直接使用C编写    
    •  编译为本地机器码,部署方便  
    •  快速上手,学习成本低  
    •  标准库基本够用  
    •  带GC  
    •  自带单元测试、性能测试、性能分析工具    
    •  开发效率不低  
    为什么选择Golang  

    View full-size slide

  11. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  C++  
    •  NodeJS  
    •  Golang  ☑  
    备选  

    View full-size slide

  12. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll Right Reserved
    竞价接口

    View full-size slide

  13. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  直接用golang的http包  
    •  只使用gorilla/mux做简单的请求路由  
    •  封装简单的HTTPBaseHandler  
    HTTP竞价接口  

    View full-size slide

  14. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    简单的HTTPBaseHandler  

    View full-size slide

  15. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  统计竞价请求数(准实时)  
    •  导入广告位信息  
    •  其他数据分析需求  
    日志处理  

    View full-size slide

  16. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  缓存  
    •  按天分割  
    日志处理:  写入  

    View full-size slide

  17. 专业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)  
    }

    View full-size slide

  18. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  并行处理多个日志文件  
    日志处理:  读取与分析  

    View full-size slide

  19. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  目前单机每天写入300G  
    •  处理结果接近实时  
    日志处理  

    View full-size slide

  20. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  重度使用Redis  
    •  存放的数据包括  
    •  CookieMapping(一个ADX会超过10亿个key)  
    •  曝光频次  
    •  DMP人群数据  
    •  实时费用消耗  
    •  其他  
    Redis集群  

    View full-size slide

  21. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  Server端:等待Redis官方  
    •  Proxy中间代理:twemproxy,维护方便,有一定的性
    能消耗  
    •  Client端:配置、维护麻烦,几乎无性能损耗  
    Redis集群  

    View full-size slide

  22. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  最终在Client端实现  
    •  一致性hash:  github.com/mncaudill/ketama  
    •  预先开启足够多的Redis实例,预防增加节点带来的数据
    迁移麻烦  
    Redis集群  

    View full-size slide

  23. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  15台机器  
    •  100个Redis实例  
    •  占用500G内存  
    •  峰值QPS在20万  
    Redis集群  

    View full-size slide

  24. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  组合多个命令一起发送(非事务)  
    Redis  Pipeline  

    View full-size slide

  25. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  Go不支持以后台进程的方式启动  
    •  使用Supervise来管理进程  
    部署:进程管理  

    View full-size slide

  26. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  独立部署  
    •  方便更新与重启  
    把服务划分为独立的进程  
    ./bin
    ├──  adx_mod
    ├──  analysis
    ├──  bid
    ├──  charge
    ├──  convrate_import
    ├──  cookie_map
    ├──  dispatch
    ├──  ip_import
    ├──  kpicharge
    ├──  pdmp
    └──  whisky

    View full-size slide

  27. 专业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  其他调优  
    部署:高并发服务器调优  

    View full-size slide

  28. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  Nginx做前端  
    •  开多个Go进程  
    •  Nginx的upstream做负载均衡  
    部署:web服务器  
    Nginx  
    Go竞价服务  
    Go竞价服务  
    Go竞价服务  

    View full-size slide

  29. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  使用DNSPod的创业版收费套餐  
    •  速度快、稳定  
    •  解析生效快  
    部署:DNS级别负载均衡  

    View full-size slide

  30. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  三个人(Golang部分)  
    •  三个多月  
    第一版正式上线  

    View full-size slide

  31. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  12台竞价服务器,CPU为8核16线程  
    •  每天40亿+竞价请求  
    •  峰值8万QPS  
    •  98%响应在10ms以内  
    •  大半年以来无异常,稳定  
    线上运行情况  

    View full-size slide

  32. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  响应时间超过80毫秒则为超时  
    •  差不多达到1%的超时率,峰值时达到2%  
    •  哪里出问题?网络?  
    超时率  

    View full-size slide

  33. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  Nginx日志打印响应时间:    $request_time    
    •  发现不少超过80毫秒的状态为499的日志  
    •  POST /bid HTTP/1.0 – "499" - "81"
    •  确定非网络原因  
    超时率  

    View full-size slide

  34. 专业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数据加载到内存中,所以进程占用内存比较大  

    View full-size slide

  35. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    1.  Stop  The  World  
    2.  Mark  
    3.  Sweep  
    4.  Clean  
    5.  Start  The  World  
    Go的GC是怎么工作的  
    GC时会停止一切工作!  

    View full-size slide

  36. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  默认  GOGC=100  :  内存翻倍时  
    •  2分钟一次强制GC  
    触发GC的条件  

    View full-size slide

  37. 专业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  

    View full-size slide

  38. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  开发时尽量注意自己考虑内存管理的问题  
    •  等待官方更加给力的GC  
    坑,怎么办?  

    View full-size slide

  39. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  每天2亿+曝光  
    •  每个曝光2个请求,每天4亿+请求  
    •  实时计算、实时写入MySQL  
    曝光统计服务  

    View full-size slide

  40. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    曝光统计服务  
    HTTP接口,
    Go服务  
    日志  Redis队列  
    Transfer,
    计算并生成SQL  
    SQL  Redis队列  
    MysQL数据库  
    读取SQL
    写入MysQL  

    View full-size slide

  41. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  应届毕业生  
    •  一个人  
    •  三个星期  
    •  接近一万行代码  
    •  性能提升7倍  
    •  部署、维护更方便  
    Golang重写原来PHP的Transfer  

    View full-size slide

  42. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    回馈社区  
    •  第三方包会有一些小坑  

    View full-size slide

  43. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  go  get  github.com/sdegutis/go.assert  
    •  import  “github.com/sdegutis/go.assert”  
    包管理  

    View full-size slide

  44. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    •  URL地址变更  
    •  无版本管理  
    包管理  

    View full-size slide

  45. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    代码管理与自动化测试:  Gitlab  

    View full-size slide

  46. 专业DSP解决方案  
    ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  
    代码管理与自动化测试:Gitlab-CI  

    View full-size slide

  47. 网络运营全流程解决方案供应商  
    Q&A

    Thanks!  

    欢迎加入我们!

    View full-size slide