Golang与高性能DSP竞价系统

6002ee051e03f0b762642ee7fafd111f?s=47 Zoom.Quiet
December 04, 2013

 Golang与高性能DSP竞价系统

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

6002ee051e03f0b762642ee7fafd111f?s=128

Zoom.Quiet

December 04, 2013
Tweet

Transcript

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    •  缓存   •  按天分割   日志处理:  写入  
  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)   }
  18. 专业DSP解决方案   ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  

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

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

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

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

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

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

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

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

    •  独立部署   •  方便更新与重启   把服务划分为独立的进程   ./bin ├──  adx_mod ├──  analysis ├──  bid ├──  charge ├──  convrate_import ├──  cookie_map ├──  dispatch ├──  ip_import ├──  kpicharge ├──  pdmp └──  whisky
  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  其他调优   部署:高并发服务器调优  
  28. 专业DSP解决方案   ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  

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

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

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

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

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

    •  Nginx日志打印响应时间:    $request_time     •  发现不少超过80毫秒的状态为499的日志   •  POST /bid HTTP/1.0 – "499" - "81" •  确定非网络原因   超时率  
  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数据加载到内存中,所以进程占用内存比较大  
  35. 专业DSP解决方案   ©  广州舜飞信息科技有限公司  All  Right  ReservedAll  Right  Reserved  

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

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

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

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

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

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

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

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

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

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

    代码管理与自动化测试:Gitlab-CI  
  47. 网络运营全流程解决方案供应商   Q&A   Thanks!     欢迎加入我们!