FreeWheel's presentation on RubyConf China 2015

FreeWheel's presentation on RubyConf China 2015

FreeWheel, as the biggest player in online premium video advertising industry in the US, builds its flagship product using Ruby on Rails since 2007. And we'd like to share with the whole community about the experience we got, especially about the systematical performance optimization in recent year.

F7d9e3113d2fd4d80fa8d2c3625cb306?s=128

donkeyjoey

October 10, 2015
Tweet

Transcript

  1. Confidential © 2014 FreeWheel 张晗@freewheel.tv 2015.09 基于Rails的⼤大型⼲⼴广告系统性 能优化

  2. Confidential •  FreeWheel简介 •  总体架构介绍 •  Rails在FreeWheel的应⽤用历程 •  Rails应⽤用性能优化 • 

    展望 2 ⼤大纲
  3. FreeWheel简介

  4. Confidential 4 FreeWheel是做什么的? ⺫⽬目前90%美国主流电视媒体和运营商使⽤用我们的⼲⼴广告平台。 2014年,我们服务的视频播放超过1250亿次。

  5. Confidential 5 MRM-FreeWheel的旗舰产品 Monetization Rights Management®

  6. Confidential 6 FreeWheel的客户

  7. Confidential 7 ⼲⼴广告集成案例

  8. 总体架构介绍

  9. Confidential 9 MRM架构简图 MRM Ad  Server UI/API:  Adver-sing/Inventory Ad  Server

    ETL  Repor-ng Ad  Tag  /  Request Ad  Manager DB:  OLTP/OLAP Inventory  Forecast Ad  Server Ad  Server Log  Files Video  Metadata
  10. Confidential 10 技术栈 Infrastructure SYSTEM   Mostly  Linux  (RHEL  5)

    STORAGE   SAN  +  NAS NETWORKING   LB  /  Akamai Integration Flash  (AS2/AS3)   iPhone/iPad  (Obj-­‐C)   Android  (Java)   Silverlight  (C#)   HTML5  /  JavaScript   Quality Cucumber Selenium Log  Replay REGRESSION   MRM/RPM  UI   VI   Ad  Server   ETL  ReporQng Forecast   Rules  Engine   Service Message  Queue(ZMQ) OLTP  (MySQL)   OLAP  (Infobright) Cache  /  Fast  Storage  (Memcached/ LevelDB/MongoDB) Task  Scheduler  (crontab,  etc)   Search     (Lucene  /  Solr) Ad  Server   (C++) BUSINESS  INTELLIGENCE     ETL  ReporQng   Forecast   (Map  Reduce  like,  C++,  Python) MRM/RPM:  UI/API (RoR,  jQuery,  Java) Management  &  Monitor  Portal   (Python,  jQuery,  SQLite)   Analy-cs     (MicroStrategy) BVI/BII/Data   Manager (Ruby,  etc.)
  11. Rails在FreeWheel的应⽤用历程

  12. Confidential 12 Ruby & Rails的应⽤用范围 Infrastructure SYSTEM   Mostly  Linux

     (RHEL  5) STORAGE   SAN  +  NAS NETWORKING   LB  /  Akamai Integration Flash  (AS2/AS3)   iPhone/iPad  (Obj-­‐C)   Android  (Java)   Silverlight  (C#)   HTML5  /  JavaScript   Quality Cucumber Selenium Log  Replay REGRESSION   MRM/RPM  UI   VI   Ad  Server   ETL  ReporQng Forecast   Rules  Engine   Service Message  Queue(ZMQ) OLTP  (MySQL)   OLAP  (Infobright) Cache  /  Fast  Storage  (Memcached/ LevelDB/MongoDB) Task  Scheduler  (crontab,  etc)   Search     (Lucene  /  Solr) Ad  Server   (C++) BUSINESS  INTELLIGENCE     ETL  ReporQng   Forecast   (Map  Reduce  like,  C++,  Python) MRM/RPM:  UI/API (RoR,  jQuery,  Java) Management  &  Monitor  Portal   (Python,  jQuery,  SQLite)   Analy-cs     (MicroStrategy) BVI/BII/Data   Manager (Ruby,  etc.)
  13. Confidential •  2007年7⽉月开始基于Rails 1.2.3开发 •  MRM UI系统代码量变化趋势 13 Rails应⽤用开发历史 快速构

    建期 业务成熟期 产品整合期 架构优 化期 Rails⼤大 升级, 代码重 构
  14. Confidential •  产品设计 –  有没有 à 如果有,是否能提供良好的⽤用户体验,包括性能 •  ⾯面对技术“⽋欠债” – 

    Patch on Patch à Refactor •  资源分配上 –  成⽴立专⻔门的基础建设团队 –  留出专⻔门⽤用于底层改进的时间 14 从快速开发到关注⽤用户体验
  15. Rails应⽤用性能优化

  16. Confidential 16 ⼩小伙伴们愉快的⽣生活着…

  17. Confidential 17 突然有⼀一天… UI is slow… …very slow!!!… UI is

    down???...
  18. Confidential 18 于是我们翻⽇日志,改代码,调参数…

  19. Confidential •  紧急修复了⼀一些慢查询 •  调整了数据库的参数 •  将与核⼼心库在同⼀一个MySQL实例上的其它库移⾛走 •  将部分对主库的访问导向从库,或搜索引擎 • 

    限制部分⽤用户不必要的访问 19 熬过了两周,我们: 但是,这是不可持续的…
  20. Confidential •  对性能的持续关注 •  性能问题的预警机制 •  便于诊断问题的⼯工具 •  系统的优化的计划 • 

    科学的容量规划 •  严格的性能测试 20 我们缺些什么?
  21. Confidential •  百万级DPV ✔ •  数百同时在线⽤用户 ✔ •  SLA:99.5%的时间⾥里⾸首⻚页全加载 <=

    4秒 ★ •  ⽤用户分布在美国全境及⻄西欧 ★ •  性能问题必须在24⼩小时内给出解决⽅方案 ★ ★ 21 那先搞清楚状况…
  22. Confidential •  开发应⽤用监控平台 •  数据访问优化 •  前端优化 •  建⽴立可持续的性能测试机制 22

    我们做了些什么
  23. Confidential 23 性能监控&预警-架构 App Log MySQL Log Solr Log …

  24. Confidential 24 性能监控&预警-Dashboard

  25. Confidential 25 数据访问优化-Overview OLTP •  修复N+1问题 •  跨Schema的连接池 •  优化索引

    •  Slave池 OLAP •  缓存Hourly 或Daily的数 据 Search •  垂直拆分 •  当作OLTP的 物化视图 Log •  基于ELK 的存储和 检索 Engine & Arch Cache Client & Connection
  26. Confidential •  没有⾼高并发,并不意味着可以⾼高枕⽆无忧 –  ⾮非常复杂的数据库设计(>700张表) –  N+1 –  读写分离不可少 – 

    产品设计问题 •  ⻓长连接并不总是顺理成章 –  当客户端的数量与数据库实例的数量严重不对称时,⻓长连接可 能导致数据库过载 –  LB的设置可能对⻓长连接并不友好 26 数据访问优化-OLTP
  27. Confidential 27

  28. Confidential •  ⼀一⽯石三⻦鸟 –  全⽂文检索 –  读写分离 –  类物化视图 • 

    技术挑战 –  针对复杂的关系型数据库设计,如何构建基于Lucene索引的实 时的物化视图 •  基于Binlog和MQ的MySQL数据变化的跟踪和分发平台 •  通过SQL来定义物化视图,然后通过⾃自动翻译SQL来实现增量数据 到索引的转换 28 数据访问优化-搜索引擎
  29. Confidential 29

  30. Confidential •  技术⽼老化 –  jQuery v1.9.1 –  Prototype v1.7_rc1 • 

    缺乏⽂文档 •  前后端边界不清楚 •  ⼤大量未优化的DOM操作导致性能不佳 30 前端优化-现有问题
  31. Confidential •  我们选择了React,因为 –  天然的Component based –  单向数据流 •  one

    and only one way –  更优的性能 •  预编译tag, virtual DOM –  较低的学习曲线 31 前端优化-框架选型
  32. Confidential 32 前端优化-Benchmark

  33. Confidential 33

  34. Confidential 34

  35. Confidential •  Props –  删除⽆无⽤用的props •  States –  尽可能保证Component⽆无状态 – 

    分析state的影响范围,尽量将其放⼊入上层容器中 •  引⼊入PureRenderMixin •  使⽤用Immutable-js •  同构(Isomorphic/Universal)JavaScript 35 前端优化-⾼高性能React应⽤用
  36. Confidential •  成⽴立性能测试团队 •  根据监控数据确定性能测试的需求 –  Expected Peak QPS =

    (DPV×0.8)/(24×3600×0.2) •  建⽴立性能回归测试的流程 •  新功能上线必须通过性能测试 36 可持续的性能测试
  37. Confidential 37 性能测试-⼯工具-Gatling

  38. Confidential •  细化性能监控 –  前端性能监控 •  升级Ruby & Rails – 

    遗留系统Ruby 1.8.7 REE à 2.1,Rails 3.2.1 à 3.2.18 à 4 •  清理数据库 –  清理垃圾数据,并完善数据定期Archive的机制 –  清理⽆无⽤用的表和库 •  搜索引擎索引的进⼀一步拆分 •  数据访问层 •  性能测试分层,性能CI 38 展望-近期的计划
  39. THANK YOU