现在大部分SNS网站都有一个功能,就是显示好友的活动状态,比如你的好友上传了一张照片、分享了一篇文章等等动作,都可以显示在你的页面里,这样大大增强了社区的互动性,也成为现在SNS网站的主要特征,对于这样一个功能,从设计角度,还是值得思考的,并不简单,特别是用户越来越多,信息海量增长的时候,我未必能提出十全十美的方案,但我们可以由简如繁梳理一下思路。
首先我们要定义用户的活动消息,也可以理解为一个事件,就是我们举的例子:用户上传照片、与别人结为好友、修改了个人资料等等,动作各有不同,但需要在结构上通用,我们先设计一个
ID //消息ID
UserID //用户ID
MsgType //消息类型,比如加好友、上传照片等不同的类型
EventMsg //消息的内容,这里我们可以用Json的数据格式来描述出不同的活动内容
CreateTime //消息创建时间
这个结构也是个数据库的结构,当用户做个一个动作之后,就会创建这样一个消息,并保存在数据库中,当显示好友的活动信息时,就从这张表里查询自己好友id的数据,并按时间显示,这个做法是一个最简单的实现,但会出现一些问题,当你与一个用户成为好友之后,该好友之前发生的动作会显示出来,而不是在成为好友时点之后的动作,同样,切断好友关系之后也有类似的问题,如果从业务角度和用户体验上可以接受的话,也没什么,但由于信息是按时间排序,有时候会给用户错乱的感觉,还有,这个信息不能删除,如果删除了所有好友就看不到这条信息了,但在Facebook里是则是可以删除好友的动作信息的,这个方法还有一个问题是,所有信息都放在一张大表里,在信息爆炸增长,个人好友也很多的情况下,查询效率会非常低,产生严重的性能障碍,如果对这张表做水平切分,则在实现上复杂了许多,性能也未必好很多,接下来我们再思考是否有更好的解决办法。
在SNS的理论里,个人好友的合理数量在150个左右(最近有文章说Facebook的人均好友数是120人 ),SNS 网站应该是有好友数量的限制的,我们就按人均150个好友来设想,是否可以在用户发生某些动作之后,针对他的所有好友都写入一条信息,所能解决的是,信息是在用户成为好友时点之后写入,用户可以删除好友的活动信息,不影响其他用户的显示,在显示时查询效率要高很多,但是负面效应也十分明显,一个用户的动作有平均150个写入,对于数据库来说开销也非常大,我们想想在这样的设计下,是否可以提高性能。
首先看数据库设计,我们要把信息表和信息与用户的对应表分开,我们上面定义的数据结构保留,我们定义它的表名为Event,我们再新建一张表EventUser,结构如下
ID //主键
EventID //Event表的ID
FriendUserID //好友的ID
CreateTime //消息创建时间
对FriendUserID做索引,当用户发生动作时,首先将动作信息写入Event表,之后查找用户的所有好友,将EventID、好友ID逐条写入EventUser表,当要显示自己的好友活动信息是,查询EventUser中FriendUserID等于自己ID的信息,并和Event表做一个Join查询就可以了。
进一步提升性能的方法,将Event里的信息缓存,比如用Memcached,EventID做为Key,内容做为Value,这样,查询 EventUser是就不用Join Event表,而是从缓存里读取,由于要记录给每个好友的信息,所以EventUser会变得非常大,平均要比我们最初设计的数据容量大150倍,我们对 EventUser表做水平切分,根据用户ID做Hash算法,基本上能均匀的分配到所有的表中,至于EventUser水平切分的算法还有多种,根据实际情况来定,总的来说就是把数据分摊掉,同时EventUser里的数据可以不永久保存,做定期删除,可以保持数据容量在一个合理的范围内。
对于用户动作之后的数据写入,可以采用异步的方法,在发生动作时,抛出一个消息,由另外一个线程在做写入操作,如果对每个动作平均150次的写入仍存顾虑,我们可以针对每个用户开出一块内存空间,或是缓存,里面保存最后50条最新的好友动作,并在每条记录里做一个持久化标志,当有50条信息都标志是 “未持久化”时,做一次数据库的写入,然后把信息置为“已持久化”,这种非实时写入的方式,可以提高一定的数据库效率,显示时,先从内存中取出,再查数据库。
还有一些问题,对不不同消息类型的处理方式不同,比如用户修改个人资料,并不是每次发生这样的动作都要做一次给朋友做一次“群发”的操作,如果遇到这个人在短时间内做了多次修改个人资料的操作,就给朋友发出多个消息,会产生垃圾信息,让人觉得很怪异,所以对于这样的操作会有一定的时效性,比如在一天之内的修改个人资料,就是一个消息,这时候的处理是更新,而不是插入。
以上是我对SNS中好友动态功能的设计思路,可能还有一些未想到的问题,还需要认真思考。
转载自:http://i.laoer.com/tag/sns
分享到:
相关推荐
在设计思路上,第一步是明确目标。通过绘制流程图,如图1和图2所示,可以梳理出网站的主要功能及其层次关系,以便于产品经理理解和分工。这些功能可能包括个人主页、消息通知、搜索与匹配、好友系统、兴趣小组等。 ...
论文部分可能详细阐述了设计思路、关键技术选择、系统架构图、功能模块详解以及性能测试结果。答辩稿和PPT则对这些内容进行精炼和可视化展示,以便于在答辩时清晰阐述项目价值和实现过程。 总的来说,《SNS网站系统...
本文将详细介绍一个SNS社交网站的核心数据库表结构及其设计思路,帮助开发者更好地理解并实现社交网站的功能。 #### 二、核心数据表设计 ##### 1. 用户表(users) - **表结构** | 列名 | 类型 | 约束 | 键 | ...
- **视觉辅助**:使用图表(如ROSE图)有助于整理和表达设计思路,清晰展示功能层次关系。 3. **功能规划**: - **社区功能**:通过图1、2所示,社区需要设计各种功能,并明确主次层级,这可能需要多个产品经理...
【PHP实例开发源码-iWeb开源三剑客之iWebSNS.zip】是一个与PHP相关的压缩包,其中包含了用于学习和研究PHP编程...对于初学者来说,这是一个很好的学习资源,而对于有一定经验的开发者,则可借鉴其设计思路和最佳实践。
同时,SNS还可以帮助企业监测市场动态,进行精准营销,从而提升销售业绩。 #### 3. SNS的网络架构及产品架构 ##### 3.1 SNS平台网络架构 SNS平台通常采用分布式系统架构,以支持大量并发用户访问和数据处理。为了...
WEBIM20.CN提供的SNS社区网站WEB即时通信解决方案凭借其强大的技术实力和灵活的设计思路,在实现即时通信功能的同时,也兼顾了系统的稳定性和用户体验。无论是对于初创型SNS平台还是成熟社交网络,这套解决方案都...
在本论文中,总体设计方案被用于描述系统的设计目标、系统需求和设计思路。 10. 详细设计:详细设计是指设计和实现系统的各个模块的详细内容。在本论文中,详细设计包括数据库设计、ER 图、数据字典、数据流图等...
【Java简单微博系统】是一个基于JavaEE平台开发的社交网络服务(SNS)应用,它提供了丰富的社交媒体功能,包括好友关系管理、粉丝关注、信息发布、帖子转发、评论互动以及内容收藏和搜索等功能。这个系统适合初学者...
5. **社交功能**: 项目中包含SNS元素,意味着它可能有用户注册、登录、好友系统、评论、点赞、分享等社交功能。这些功能需要后端提供API接口,前端进行调用,同时确保数据的安全性和用户隐私。 6. **支付集成**: ...
作为一款SNS社交系统,JEESNS提供了丰富的社交功能,包括但不限于用户注册、登录、个人资料管理、好友系统、消息通知、动态分享、评论互动等。这些功能的实现,依赖于JAVA平台的强类型和健壮的异常处理机制,确保了...
源代码是软件的灵魂,它揭示了系统的工作原理和设计思路。对于开发者来说,研究源代码有助于理解如何构建一个完整的社交网络系统,包括用户管理、内容发布、互动交流等功能模块。OpenPNE采用PHP编程语言,这意味着...
通过上述介绍,我们可以看出WebApp开放平台采用了高度模块化的设计思路,通过一系列精心设计的子系统来支持大规模用户的同时在线和高效的应用开发。其设计重点在于提供高度可靠、易用且安全的平台,以便开发者能够...