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

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.

Avatar for donkeyjoey

donkeyjoey

October 10, 2015
Tweet

Other Decks in Programming

Transcript

  1. 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
  2. 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.)
  3. 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.)
  4. Confidential •  产品设计 –  有没有 à 如果有,是否能提供良好的⽤用户体验,包括性能 •  ⾯面对技术“⽋欠债” – 

    Patch on Patch à Refactor •  资源分配上 –  成⽴立专⻔门的基础建设团队 –  留出专⻔门⽤用于底层改进的时间 14 从快速开发到关注⽤用户体验
  5. Confidential •  百万级DPV ✔ •  数百同时在线⽤用户 ✔ •  SLA:99.5%的时间⾥里⾸首⻚页全加载 <=

    4秒 ★ •  ⽤用户分布在美国全境及⻄西欧 ★ •  性能问题必须在24⼩小时内给出解决⽅方案 ★ ★ 21 那先搞清楚状况…
  6. Confidential 25 数据访问优化-Overview OLTP •  修复N+1问题 •  跨Schema的连接池 •  优化索引

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

    产品设计问题 •  ⻓长连接并不总是顺理成章 –  当客户端的数量与数据库实例的数量严重不对称时,⻓长连接可 能导致数据库过载 –  LB的设置可能对⻓长连接并不友好 26 数据访问优化-OLTP
  8. Confidential •  ⼀一⽯石三⻦鸟 –  全⽂文检索 –  读写分离 –  类物化视图 • 

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

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

    and only one way –  更优的性能 •  预编译tag, virtual DOM –  较低的学习曲线 31 前端优化-框架选型
  11. Confidential •  Props –  删除⽆无⽤用的props •  States –  尽可能保证Component⽆无状态 – 

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

    (DPV×0.8)/(24×3600×0.2) •  建⽴立性能回归测试的流程 •  新功能上线必须通过性能测试 36 可持续的性能测试
  13. Confidential •  细化性能监控 –  前端性能监控 •  升级Ruby & Rails – 

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