MongoDB practice:基于MongoDB的好友消息动态的实现思路(How to build activity-streaming with MongoDb)
来源:互联网 发布:infinite综艺知乎 编辑:程序博客网 时间:2024/05/20 22:03
好友动态是SNS最常见的功能。在设计“视觉中国原创榜”的好友动态时,也遇到如何实现的问题。和普通的SNS不同,
视觉中国原创榜用户不仅仅关注好友的动态,而且也要关注自己的作品和自己曾经关注过的作品的动态。
这样,就需要给用户分别push 3种不同的动态: 我的作品的动态,我关注过的作品(包括收藏过,评论过,评分过)的动态,
以及我关注的人(followed)的动态,未来还有好友的动态。这些动态,用户都应该可以取消关注。如何实现?
使用传统的数据库会面临很多问题,比如如何sharding。 幸运的是,我们用的MongoDB,这给我们解决问题带来了极大的方便。
首先,对每个用户,分别设计以下 collection
//by nightsailer.com
activity_streaming.feed, 属性分别为:
$schema = array(
_id, 用户id
followed_art => array(), 用户关注的作品id列表
followed_people=>array(), 用户关注的人id列表
my_art => array() 用户的作品id 列表
)
//by nightsailer.com
activity_stream.user:
_id
type=> 动态steam的类型(我关注的作品,我的作品,我关注的人)
stream_target => 对应动态stream的对象(作品id,人id)
stream => array() FIFO数组,存放activity的DBRef
time => int 最后一次activity的时间戳
activity_stream.site
_id uuid
type: 动态类型
data: hash 动态数据
time
activity_stream.queue
同 activity_stream.site
存放待处理的动态队列
我们使用异步处理方式,按照以下流程:
1. 当用户某些动作产生一个事件后,将事件push到activity_stream.queue, 通知worker进行处理
2. worker 被唤醒,从activity_stream.queue中提取未处理的事件。
3. worker 将事件放入activity_stream.site,作为全站动态广播
4. worker 从activity_streaming.feed中反向查找事件的作品或作者是否有对应的人,如果有,则将此事件id
push到activity_stream.user 的对应fifo数组中。
(这是MongoDB最兴奋的地方,可以直接查询数组中的值,只要对数组进行索引)
这样,用户可以:
- 从activity_stream.user 中删除某个事件
- 从activity_stream.feed 中删除某个关注的对象(实现类似忽略这个人的动态,忽略这个作品的动态等等)
- 当用户关注好友后,将其加入activity_stream.feed
- 当用户上传作品后,将作品加入activity_stream.feed
- 当用收藏、评分、评论后,将其作品加入activity_stream.feed
以上是MongoDB实践的第二篇,待续。
- MongoDB practice:基于MongoDB的好友消息动态的实现思路(How to build activity-streaming with MongoDb)
- MongoDB的应用:动态消息的设计实现
- How to use Elasticsearch with MongoDB?
- MongoDB 索引技巧 #1: 查找好友最新的动态
- 基于java实现mongodb的数据库连接池
- 基于mongodb的地理检索实现
- 基于Docker的MongoDB实现授权访问
- 基于Docker的MongoDB实现授权访问
- 使用mongodb实现首页的动态显示
- MongoDB集群搭建及Sharding的实现思路
- MongoDB集群搭建及Sharding的实现思路
- how to design MongoDB schema
- 基于MongoDB MapReduce的统计分析
- 基于MongoDB MapReduce的统计分析
- 基于MongoDB MapReduce的统计分析
- mongodb 基于地理位置的查询
- 基于python的spark mongodb
- 基于NodeJS的MongoDB数据库的动态创建
- ubuntu12.04安装tftp、配置tftp服务错误
- UVA 718 - Skyscraper Floors(数论)
- 编程算法 - 最小的k个数 红黑树 代码(C++)
- Session超时跳转到指定页面(filter实现)解决了图片被过滤问题
- java ClassLoader入门
- MongoDB practice:基于MongoDB的好友消息动态的实现思路(How to build activity-streaming with MongoDb)
- Red Hat Enterprise Linux 6.5 Server 正式版发布 附文件MD5及SHA-256
- 飞信SNS FEED分享
- eclipse中文乱码问题解决方案
- 插值方法
- Oracle中in和exists的选择
- c语言结构体注意点
- static、extern的用法与区别
- apr_pool -- 内存池