好友动态是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
分享到:
相关推荐
内容概要:本项目是基于微信小程序的交友系统的设计与实现,旨在提供一个便捷、高效的线上交友平台。系统包括用户注册与登录、个人资料管理、好友推荐、聊天功能、动态发布与浏览等模块。前端使用微信小程序框架开发...
内容概要:本项目是基于微信小程序、Socket和Node.js的即时通讯(IM)系统的设计与实现,旨在提供一个实时、高效的消息传输平台。系统包括用户注册与登录、好友管理、实时聊天、群聊功能、消息推送等模块。前端使用...
首先,`QDatagramPacket` 类是基于 `java.net.DatagramPacket` 类的一个包装类,实现了 `Serializable` 接口,以便在网络中进行序列化和反序列化传输。这个类主要用于封装发送和接收的数据,包括数据类型(type)和...
可能使用的关系型数据库如MySQL或非关系型数据库如MongoDB,用于存储用户资料、好友连接、用户行为日志等。数据库设计需要考虑到数据的一致性、效率和扩展性,可能涉及到索引优化、分区策略等技术。 这个系统的设计...
- 云数据库:提供基于MongoDB的JSON数据库,支持小程序端和云函数中的CRUD操作,简化数据管理。 - 云函数:无需自建服务器,可以直接执行预定义的代码逻辑,用于处理业务逻辑和服务端任务。 - 存储服务:便捷地上传...
本文介绍了一个基于Java的网络即时通讯系统的整体设计思路和关键技术实现。通过使用Java Swing组件,系统实现了跨平台的友好用户界面。此外,通过合理的网络通讯协议选择和数据库集成,确保了系统的高效稳定运行。...
- 好友系统:好友列表展示,搜索添加好友功能,可能使用Firebase Realtime Database或自建后端实现数据同步。 - 聊天室:群聊功能需要处理多对多的消息传递,可能需要服务器端的支持。 - 音视频通话:可能集成如 ...
在聊天应用中,Java可能被用于实现用户认证、消息发送与接收、在线状态管理等功能。标签中的"springboot"暗示了项目采用了Spring Boot框架,这是一个简化Java应用程序开发的框架,具有自动配置、起步依赖和内嵌...
搜索好友功能通常基于用户的兴趣、地理位置等因素。这需要实现高效的查询算法,并可能涉及到推荐系统,通过算法为用户匹配潜在的好友。这部分的代码可能在【jdfriend】的搜索或推荐模块中。 聊天功能是交友网站的...
【标题】:“Web聊天系统”是一个在线交流平台的实现,主要功能涵盖机器人聊天、群聊、一对一私聊以及类似QQ的好友推荐与添加机制。这个系统不仅提供了基本的文字沟通方式,还可能融入了多媒体交互、实时消息传递等...
通过学习QQ的源码,可以了解大型即时通信系统的设计思路、优化技巧和异常处理策略。 11. **UI设计与事件处理** JavaFX或Swing可以用于构建即时通信系统的图形用户界面,事件监听机制负责处理用户的交互行为。 12....
WXML文件定义了页面的结构和组件布局,可以绑定数据,实现动态更新。 2. **WXSS(微信小程序样式语言)**:类似于CSS,用于控制页面元素的样式。WXSS支持大部分CSS特性,同时加入了一些特有的属性和选择器,如尺寸...
爬题思路:不断进行好友对战获取题目,随意提交答案会返回正确答案,存入数据库,重复的忽略 分别使用两个微信号登录游戏,抓登录的请求 https://puzzle-gateway.zaih.com/pauthp/jwt 复制返回的 access_token 和 ...
7. **数据库管理**:存储用户信息、好友关系、聊天记录等,可能用到SQL数据库如MySQL,或NoSQL数据库如MongoDB。 8. **事件驱动编程**:使用监听器和事件处理机制,响应用户的操作,如Java的Observer模式。 9. **...
通过本套源码的学习,开发者不仅可以深入理解即时通讯应用的设计思路和技术实现细节,还能积累宝贵的实战经验,为日后独立开发同类产品打下坚实的基础。同时,借助于详实的教学资料和丰富的功能示例,即使是初学者也...
HappyChat可能使用关系型数据库(如MySQL)或非关系型数据库(如MongoDB)来存储用户信息、好友关系和聊天记录。数据库设计应考虑查询效率,如合理设置索引。 5. **安全性**:为了保护用户隐私和数据安全,...
在提供的源代码和论文中,你将能够看到这些概念如何被实际应用,从设计思路到具体实现,包括类结构、函数调用和数据结构的选择。通过学习这个项目,开发者不仅可以掌握即时通讯系统的基本架构,还能提升Java编程和...
关系型数据库如MySQL或PostgreSQL适合存储用户信息、好友关系等结构化数据,而NoSQL数据库如MongoDB则适用于存储大量实时更新的聊天记录。同时,为了保证数据的一致性和高可用性,可能需要引入分布式事务处理或CAP...