AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

基于Rails的大型广告系统性能优化 by 张晗@freewheel.tv

发布者 ruby
发布于 1447636638794  浏览 6564 关键词 Ruby 
分享到

第1页

基于Rails的⼤大型⼲⼴广告系统性 能优化

张晗@freewheel.tv 2015.09

© 2014 FreeWChoeneflidential



第2页

⼤大纲

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

Confidential





第3页

FreeWheel简介



第4页

FreeWheel是做什么的?

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



Confidential





第5页

MRM-FreeWheel的旗舰产品

Monetization Rights Management®



Confidential





第6页

FreeWheel的客户



Confidential





第7页

⼲⼴广告集成案例



Confidential





第8页

总体架构介绍



第9页

MRM架构简图



Ad
 Tag
 /
 Request



Ad
 Manager



MRM

Ad
 Server

Ad
 Server



Ad
 Server Ad
 Server



Log
 Files ETL
 Repor-ng



Inventory
 Forecast



Video
 Metadata



DB:
 OLTP/OLAP



UI/API:
 Adver-sing/Inventory



Confidential





第10页

技术栈



Integration



Flash
 (AS2/AS3)
 



iPhone/iPad
 (Obj-­‐C)
  Android
 (Java)
 



HTML5
 /
 JavaScript
  Silverlight
 (C#)
 



Service

BUSINESS
 INTELLIGENCE
  
 

ETL
 ReporQng
  Forecast
 

(Map
 Reduce
 like,
 C++,
 Python)



Ad
 Server
  (C++)



Management
 &
 Monitor
 Portal
  (Python,
 jQuery,
 SQLite)



MRM/RPM:
 UI/API (RoR,
 jQuery,
 Java)




  Analy-cs
 
  (MicroStrategy)



BVI/BII/Data
  Manager (Ruby,
 etc.)




  Search
 
  (Lucene
 /
 Solr)



Message
 Queue(ZMQ) Task
 Scheduler
 (crontab,
 etc)



Cache
 /
 Fast
 Storage
 (Memcached/ LevelDB/MongoDB) OLTP
 (MySQL)




  OLAP
 (Infobright)



Infrastructure

SYSTEM
  Mostly
 Linux
 (RHEL
 5)



STORAGE
  SAN
 +
 NAS



NETWORKING
  LB
 /
 Akamai



Quality

Cucumber

Selenium

Log
 Replay

REGRESSION
  MRM/RPM
 UI
 

VI
  Ad
 Server
  ETL
 ReporQng Forecast
  Rules
 Engine
 



Confidential





第11页

Rails在FreeWheel的应⽤用历程



第12页

Ruby & Rails的应⽤用范围



Integration



Flash
 (AS2/AS3)
 



iPhone/iPad
 (Obj-­‐C)
  Android
 (Java)
 



HTML5
 /
 JavaScript
  Silverlight
 (C#)
 



Service

BUSINESS
 INTELLIGENCE
  
 

ETL
 ReporQng
  Forecast
 

(Map
 Reduce
 like,
 C++,
 Python)



Ad
 Server
  (C++)



Management
 &
 Monitor
 Portal
  (Python,
 jQuery,
 SQLite)



MRM/RPM:
 UI/API (RoR,
 jQuery,
 Java)




  Analy-cs
 
  (MicroStrategy)



BVI/BII/Data
  Manager (Ruby,
 etc.)




  Search
 
  (Lucene
 /
 Solr)



Message
 Queue(ZMQ) Task
 Scheduler
 (crontab,
 etc)



Cache
 /
 Fast
 Storage
 (Memcached/ LevelDB/MongoDB) OLTP
 (MySQL)




  OLAP
 (Infobright)



Infrastructure

SYSTEM
  Mostly
 Linux
 (RHEL
 5)



STORAGE
  SAN
 +
 NAS



NETWORKING
  LB
 /
 Akamai



Quality

Cucumber

Selenium

Log
 Replay

REGRESSION
  MRM/RPM
 UI
 

VI
  Ad
 Server
  ETL
 ReporQng Forecast
  Rules
 Engine
 



Confidential





第13页

Rails应⽤用开发历史

• 2007年7⽉月开始基于Rails 1.2.3开发 • MRM UI系统代码量变化趋势



快速构 建期



业务成熟期



Rails⼤大 升级, 代码重 构



产品整合期



架构优 化期



Confidential





第14页

从快速开发到关注⽤用户体验

• 产品设计

– 有没有 à 如果有,是否能提供良好的⽤用户体验,包括性能

• ⾯面对技术“⽋欠债”

– Patch on Patch à Refactor

• 资源分配上

– 成⽴立专门的基础建设团队 – 留出专门⽤用于底层改进的时间



Confidential





第15页

Rails应⽤用性能优化



第16页

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



Confidential





第17页

突然有⼀一天…

UI is slow…

…very slow!!!…

UI is downjQuery110208806107913899787_1447636704502?...



Confidential





第18页

于是我们翻⽇日志,改代码,调参数…



Confidential





第19页

熬过了两周,我们:

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

但是,这是不可持续的…



Confidential





第20页

我们缺些什么?

• 对性能的持续关注 • 性能问题的预警机制 • 便于诊断问题的⼯工具 • 系统的优化的计划 • 科学的容量规划 • 严格的性能测试

Confidential





第21页

那先搞清楚状况…

• 百万级DPV ✔ • 数百同时在线⽤用户 ✔ • SLA:99.5%的时间⾥里⾸首⻚页全加载 <= 4秒 ★ • ⽤用户分布在美国全境及⻄西欧 ★ • 性能问题必须在24⼩小时内给出解决⽅方案 ★ ★



Confidential





第22页

我们做了些什么

• 开发应⽤用监控平台 • 数据访问优化 • 前端优化 • 建⽴立可持续的性能测试机制

Confidential





第23页

性能监控&预警-架构



App Log



MySQL Log



Solr Log







Confidential





第24页

性能监控&预警-Dashboard



Confidential





第25页

数据访问优化-Overview



OLTP

Client & Connection

• 修复N+1问题 • 跨Schema的连接池



OLAP



Search



Log



Cache

Engine & Arch • 优化索引 • Slave池



• 缓存Hourly 或Daily的数 据



• 垂直拆分 • 基于ELK



• 当作OLTP的 的存储和



物化视图



检索



Confidential





第26页

数据访问优化-OLTP

• 没有⾼高并发,并不意味着可以⾼高枕⽆无忧

– ⾮非常复杂的数据库设计(>700张表) – N+1 – 读写分离不可少 – 产品设计问题

• ⻓长连接并不总是顺理成章

– 当客户端的数量与数据库实例的数量严重不对称时,⻓长连接可 能导致数据库过载

– LB的设置可能对⻓长连接并不友好



Confidential





第27页

Confidential





第28页

数据访问优化-搜索引擎

• ⼀一⽯石三⻦鸟

– 全⽂文检索 – 读写分离 – 类物化视图

• 技术挑战

– 针对复杂的关系型数据库设计,如何构建基于Lucene索引的实 时的物化视图

• 基于Binlog和MQ的MySQL数据变化的跟踪和分发平台 • 通过SQL来定义物化视图,然后通过⾃自动翻译SQL来实现增量数据

到索引的转换



Confidential





第29页

Confidential





第30页

前端优化-现有问题

• 技术⽼老化

– jQuery v1.9.1 – Prototype v1.7_rc1

• 缺乏⽂文档 • 前后端边界不清楚 • ⼤大量未优化的DOM操作导致性能不佳



Confidential





第31页

前端优化-框架选型

• 我们选择了React,因为

– 天然的Component based – 单向数据流

• one and only one way

– 更优的性能

• 预编译tag, virtual DOM

– 较低的学习曲线

Confidential





第32页

前端优化-Benchmark



Confidential





第33页

Confidential





第34页

Confidential





第35页

前端优化-⾼高性能React应⽤用

• Props

– 删除⽆无⽤用的props

• States

– 尽可能保证Component⽆无状态 – 分析state的影响范围,尽量将其放⼊入上层容器中

• 引⼊入PureRenderMixin • 使⽤用Immutable-js • 同构(Isomorphic/Universal)JavaScript



Confidential





第36页

可持续的性能测试

• 成⽴立性能测试团队 • 根据监控数据确定性能测试的需求

– Expected Peak QPS = (DPV×0.8)/(24×3600×0.2)

• 建⽴立性能回归测试的流程 • 新功能上线必须通过性能测试



Confidential





第37页

性能测试-⼯工具-Gatling



Confidential





第38页

展望-近期的计划

• 细化性能监控

– 前端性能监控

• 升级Ruby & Rails

– 遗留系统Ruby 1.8.7 REE à 2.1,Rails 3.2.1 à 3.2.18 à 4

• 清理数据库

– 清理垃圾数据,并完善数据定期Archive的机制 – 清理⽆无⽤用的表和库

• 搜索引擎索引的进⼀一步拆分 • 数据访问层 • 性能测试分层,性能CI



Confidential





第39页

THANK YOU



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。