本文以用户
feed
作为案例
MongoDB集群结构
数据量较小
采用MongoDB三节点副本集的方式构造集群
数据量较大
使用sharding
方式扩展单个集群的容量
数据量非常大
不同时期的Feed数据写入到不同的MongoDB Cluster中,避免单个MongoDB集群规模过大带来各种运维上的问题
- 每个MongoDB Cluster保存的数据包括:
- 元数据
- 时间范围:指定当前cluster保存那一段时间的feed信息
- Feed数据
- 使用一个collection保存所有用户的feed
- 这个collection的根据用户的user_id进行分片,适应写、读扩容场景
- 元数据
- 客户端程序根据MongoDB Cluster的元数据将收到的Feed消息写入到对应的MongoDB Cluster
- 客户端程序启动时从所有的MongoDB Cluster中加载元数据
Feed DB的结构
metadata
集合
1 | { |
feed
集合
1 | { |
feed.data_key
用于根据业务对象查找对应feed
记录的标识,主要用于删除场景,生成算法如下:
feed.data_key = MMH3Hash("fabula_" + $fabulaId)
feed._id
的生成算法:
- 同
ObjectID
的生成算法,包含time
,machine identifier
,process id
,counter
四部分,使用feed.event_time
作为第一部分 ObjectID
生成算法参考: https://github.com/go-mgo/mgo/blob/v2/bson/bson.go
参考
- 陌陌:日请求量过亿,谈陌陌的Feed服务优化之路
- 几个大型网站的Feeds(Timeline)设计简单对比
- 新浪微博:大数据时代的feed流架构
- 新浪微博:Feed架构-我们做错了什么
- 新浪微博:Feed消息队列架构分析
- Pinterest:Pinterest的Feed架构与算法
- Pinterest:Building a smarter home feed
- Pinterest:Building a scalable and available home feed
- Pinterest:Pinterest 的 Smart Feed 架构与算法
- Pinterest:Pinnability: Machine learning in the home feed