第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