Feed 系统结构浅析 人人网  张铁安
Feed 系统的定位及功能描述 是 SNS 的核心功能 是 SNS 网站中用户信息的扩散传播通道 需要很高的实时性 与各业务系统联系紧密( input & output ) 高效、稳定、抗压力强 系统的复杂度高
面临的挑战 用户产生的数据量巨大 假定按平均 1000 条 / 秒计算,用户每天产生近亿条数据 Feed 的扩散范围大(从几个人到几百万人) 合并、去重、排序规则复杂,要求实时,响应快速 用户请求量大 根据各业务的需要,提供个性化的筛选策略
关于 Push Or Pull  的思考 获取数据的两种方式 推模式 拉模式 结论 从查询的效率考虑,推模式更合适
Feed System 构成 Dispatch NewsFeed Index Cache User interaction feedback Sorting algorithm & Friend Rank MiniFeed Index Cache FeedContent Cache NewsFeed Index Persistence (index db) Rendering engine (data + template)
系统结构图
技术细节 Feed 的分发系统 Feed 的 Cache 系统 Index Cache Content Cache 数据压缩 Index 的持久化存储系统 页面显示用的渲染引擎 基于内容及用户行为反馈的排序算法(略)
关于 Open Source Feed 系统中使用的 OpenSource 项目 ICE (通信框架) Mysql ( DB ) Memcache + libmemcached ( Content  内存 Cache ) Google Protobuf  (对象的序列化及反序列化) Quicklz  (二进制数据压缩) Boost multi-index container (多索引结构) Tokyo Tyrant  ( key-value 存储引擎) Google Ctemplate  (数据的模板渲染引擎) Nginx + FastCgi  ( WebServer )
Feed 的分发系统 数据的拆分 Index + content 收消息用户列表的 Cache 策略 LRU & Update Notify 异步线程池 合理设置线程个数解决脉冲式请求
Feed Cache 的内存优化 FlyWeight 的设计思想
基于 FlyWeight 思想的 Cache 结构 FeedContentCache & Index Cache 服务间的 FlyWeight
Index 服务内步的 FlyWeight 结构 FeedNews 服务内部的 FlyWeight
Index Cache 的多条件查询 利用 multi_index 支持类似数据库的查寻方式,对同一个数据集,可以按不同的维度建立索引,方便支持不同条件的查询,同时对于排序结果,可以做到实时的更新
Boost Multi Index Container
关于内存的压缩存储 各种压缩方法 zlib lzo fastlz lzf quicklz 对象序列化及压缩 Protobuf + quicklz
Memcache & McProxy 高扩展性的内存 Cache 方案 我们对内存 Cache 的要求 支持高并发 在内存容量不断增加的情况下,查询性能不会有大的降低 易于扩容及高可用性(一致性哈希) 统一的配置管理,使用简单
Memcache 集群
索引的持久化系统 索引持久化的原因 解决索引的内存 Cache 重启后无法快速恢复的问题 利用相对便宜的存储介质为用户尽量保存多一些内容 需要解决的问题 每天近 60 亿条索引的持久化存储 (5w+ write/s) 传说中的解决方案 Mysql ? (最高 1K query/s ) Open Source key-value db ? ( 还是不够快 ) GFS ?  ( 听说 Google 有,但是光盘没有卖的 )
索引的持久化系统 —— 五花八门的 key-value DB
索引的持久化系统 ——  Feed Index DB 需要解决的难题 数万级的每秒写入 每秒几千次的随机读 每天 100G+ 的新增索引数据
索引的持久化系统 ——  Feed Index DB 解决思路 常规办法对于每秒几万次的写入,除了堆几十或上百台机器,别无它法。测试结果:做 Raid5 的机器,在完全随机写的情况下, IOPS 也就能到 800+ 如果我们将随机写改为顺序写文件,写入效率会高出很多 需要充分的利用内存,在内存中将写入的随机索引进行整理和积攒,再顺序的写入硬盘 由于使用了延迟写入内存的方式,需要在 Log 中记录所有操作,方便出问题时能找回内存中的数据 使用异步 Direct IO ,不要让 OS 多管闲事,浪费内存 选用更牛 B 的硬盘,我们用的是 SSD
索引的持久化系统 ——  Feed Index DB 解决方案 合并写操作 通过 Log 保证 Down 机后数据恢复 使用 TT 保存索引 使用异步 IO 读写文件 使用 Direct IO 屏蔽 OS 的 Cache 策略 使用 SSD 解决大量的并发读取
索引的持久化系统 ——  Feed Index DB 结构 Index Node 责任存储  UserID  到 最新一块 Data Block 的位置信息 使用 Tokyo Tyrant 保存 key-value 对应关系 因为数据量很小,所以 TT 很好用 Data Node 异步的 Direct IO 每个用户可以分配 N 个 Block ,每个 Block 占 2K 大小, N 个 Block 首尾相连,很像一个单向链表
索引的持久化系统 ——  Data File  结构
模板的渲染引擎及展示 数据格式的一致性 由于 Feed 的输入很多,自来各个不同业务,需要保证数据格式的一致性,输出时,通过渲染引擎将数据转化为不同的 View ,提供给各业务 技术方案 Ctemplate 提供高效的模板渲染能力 Nginx+FastCgi 提供高并发的 Web 服务
想 了解更多有趣内容,欢迎加入我们的开发团队 我们正在努力做好的事情 Feed System (新鲜事系统) IM Server  (人人桌面服务器端) Ad Engine (广告引擎系统) 感兴趣的快来报名 Linux C++ 开发工程师( 3~5 人) Email : [email_address] [email_address]
End thanks

More Related Content

PPT
Sybase IQ 15.0
PPTX
数据库系统设计漫谈
PPTX
Feed服务架构-新浪微博新员工培训议题
PDF
新浪微博Feed服务架构
PPT
Sina my sq概述及优化
PPTX
Ocean base海量结构化数据存储系统 hadoop in china
PDF
大数据时代feed架构 (ArchSummit Beijing 2014)
PPTX
淘宝双11双12案例分享
Sybase IQ 15.0
数据库系统设计漫谈
Feed服务架构-新浪微博新员工培训议题
新浪微博Feed服务架构
Sina my sq概述及优化
Ocean base海量结构化数据存储系统 hadoop in china
大数据时代feed架构 (ArchSummit Beijing 2014)
淘宝双11双12案例分享

Similar to 张铁安:Feed系统架构浅析 (18)

PDF
Dreaming Infrastructure
PPTX
Nosql三步曲
PPT
百度分布式数据库 刘斌 Sacc2010
PPT
百度分布式数据库平台
PDF
Mysql HandleSocket技术在SNS Feed存储中的应用
PPTX
Web Caching Architecture and Design
PDF
大型网站架构的发展
PDF
大型网站架构的发展
PPTX
Ocean base 千亿级海量数据库-日照
PDF
Bypat博客出品-服务器运维集群方法总结2
PDF
1.4 go在数据存储上面的应用—毛剑
PDF
豆瓣数据架构实践
PDF
Bypat博客出品-服务器运维集群方法总结
KEY
新浪微博平台与安全架构
PPT
Dfs ning
PPT
Aswan&hump
PPTX
分布式索引系统调研
PPTX
Google key technologies
Dreaming Infrastructure
Nosql三步曲
百度分布式数据库 刘斌 Sacc2010
百度分布式数据库平台
Mysql HandleSocket技术在SNS Feed存储中的应用
Web Caching Architecture and Design
大型网站架构的发展
大型网站架构的发展
Ocean base 千亿级海量数据库-日照
Bypat博客出品-服务器运维集群方法总结2
1.4 go在数据存储上面的应用—毛剑
豆瓣数据架构实践
Bypat博客出品-服务器运维集群方法总结
新浪微博平台与安全架构
Dfs ning
Aswan&hump
分布式索引系统调研
Google key technologies
Ad

张铁安:Feed系统架构浅析

  • 2. Feed 系统的定位及功能描述 是 SNS 的核心功能 是 SNS 网站中用户信息的扩散传播通道 需要很高的实时性 与各业务系统联系紧密( input & output ) 高效、稳定、抗压力强 系统的复杂度高
  • 3. 面临的挑战 用户产生的数据量巨大 假定按平均 1000 条 / 秒计算,用户每天产生近亿条数据 Feed 的扩散范围大(从几个人到几百万人) 合并、去重、排序规则复杂,要求实时,响应快速 用户请求量大 根据各业务的需要,提供个性化的筛选策略
  • 4. 关于 Push Or Pull 的思考 获取数据的两种方式 推模式 拉模式 结论 从查询的效率考虑,推模式更合适
  • 5. Feed System 构成 Dispatch NewsFeed Index Cache User interaction feedback Sorting algorithm & Friend Rank MiniFeed Index Cache FeedContent Cache NewsFeed Index Persistence (index db) Rendering engine (data + template)
  • 7. 技术细节 Feed 的分发系统 Feed 的 Cache 系统 Index Cache Content Cache 数据压缩 Index 的持久化存储系统 页面显示用的渲染引擎 基于内容及用户行为反馈的排序算法(略)
  • 8. 关于 Open Source Feed 系统中使用的 OpenSource 项目 ICE (通信框架) Mysql ( DB ) Memcache + libmemcached ( Content 内存 Cache ) Google Protobuf (对象的序列化及反序列化) Quicklz (二进制数据压缩) Boost multi-index container (多索引结构) Tokyo Tyrant ( key-value 存储引擎) Google Ctemplate (数据的模板渲染引擎) Nginx + FastCgi ( WebServer )
  • 9. Feed 的分发系统 数据的拆分 Index + content 收消息用户列表的 Cache 策略 LRU & Update Notify 异步线程池 合理设置线程个数解决脉冲式请求
  • 10. Feed Cache 的内存优化 FlyWeight 的设计思想
  • 11. 基于 FlyWeight 思想的 Cache 结构 FeedContentCache & Index Cache 服务间的 FlyWeight
  • 12. Index 服务内步的 FlyWeight 结构 FeedNews 服务内部的 FlyWeight
  • 13. Index Cache 的多条件查询 利用 multi_index 支持类似数据库的查寻方式,对同一个数据集,可以按不同的维度建立索引,方便支持不同条件的查询,同时对于排序结果,可以做到实时的更新
  • 14. Boost Multi Index Container
  • 15. 关于内存的压缩存储 各种压缩方法 zlib lzo fastlz lzf quicklz 对象序列化及压缩 Protobuf + quicklz
  • 16. Memcache & McProxy 高扩展性的内存 Cache 方案 我们对内存 Cache 的要求 支持高并发 在内存容量不断增加的情况下,查询性能不会有大的降低 易于扩容及高可用性(一致性哈希) 统一的配置管理,使用简单
  • 18. 索引的持久化系统 索引持久化的原因 解决索引的内存 Cache 重启后无法快速恢复的问题 利用相对便宜的存储介质为用户尽量保存多一些内容 需要解决的问题 每天近 60 亿条索引的持久化存储 (5w+ write/s) 传说中的解决方案 Mysql ? (最高 1K query/s ) Open Source key-value db ? ( 还是不够快 ) GFS ? ( 听说 Google 有,但是光盘没有卖的 )
  • 20. 索引的持久化系统 —— Feed Index DB 需要解决的难题 数万级的每秒写入 每秒几千次的随机读 每天 100G+ 的新增索引数据
  • 21. 索引的持久化系统 —— Feed Index DB 解决思路 常规办法对于每秒几万次的写入,除了堆几十或上百台机器,别无它法。测试结果:做 Raid5 的机器,在完全随机写的情况下, IOPS 也就能到 800+ 如果我们将随机写改为顺序写文件,写入效率会高出很多 需要充分的利用内存,在内存中将写入的随机索引进行整理和积攒,再顺序的写入硬盘 由于使用了延迟写入内存的方式,需要在 Log 中记录所有操作,方便出问题时能找回内存中的数据 使用异步 Direct IO ,不要让 OS 多管闲事,浪费内存 选用更牛 B 的硬盘,我们用的是 SSD
  • 22. 索引的持久化系统 —— Feed Index DB 解决方案 合并写操作 通过 Log 保证 Down 机后数据恢复 使用 TT 保存索引 使用异步 IO 读写文件 使用 Direct IO 屏蔽 OS 的 Cache 策略 使用 SSD 解决大量的并发读取
  • 23. 索引的持久化系统 —— Feed Index DB 结构 Index Node 责任存储 UserID 到 最新一块 Data Block 的位置信息 使用 Tokyo Tyrant 保存 key-value 对应关系 因为数据量很小,所以 TT 很好用 Data Node 异步的 Direct IO 每个用户可以分配 N 个 Block ,每个 Block 占 2K 大小, N 个 Block 首尾相连,很像一个单向链表
  • 25. 模板的渲染引擎及展示 数据格式的一致性 由于 Feed 的输入很多,自来各个不同业务,需要保证数据格式的一致性,输出时,通过渲染引擎将数据转化为不同的 View ,提供给各业务 技术方案 Ctemplate 提供高效的模板渲染能力 Nginx+FastCgi 提供高并发的 Web 服务
  • 26. 想 了解更多有趣内容,欢迎加入我们的开发团队 我们正在努力做好的事情 Feed System (新鲜事系统) IM Server (人人桌面服务器端) Ad Engine (广告引擎系统) 感兴趣的快来报名 Linux C++ 开发工程师( 3~5 人) Email : [email_address] [email_address]

Editor's Notes

  • #5: Push 优点:计算前置,提前准备好需要的数据,取数据时无需多余的计算 缺点:产生分发,可能会产生一些不必要的计算 Pull 优点:随需计算 缺点:计算量非常大,引响取数据的速度
  • #13: 需要注意的是 , 如果内存中没有大量的重复的索引结构,这种设计是没有节约内存的意义的