`
myreligion
  • 浏览: 205683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

做SNS的,一起来猜猜新浪微博的核心Feed系统是怎么设计的吧

阅读更多
要是不清楚什么是feed,google之。

Feed是sns类应用的核心和最复杂的部分,就是sina微博中看到的“我关注的人”的消息。像人人网中的“新鲜事”等等,都是一个东西。你想啊,你关注了几千人,又被几千人关注,你发了一个消息,另外几千人怎么看到哪?拿数据库做join和in操作肯定立刻挂。而且像sina weibo,数据和访问量庞大,怎么实现哪?这其实就是传说中的推和拉的选择,人人网写过一篇文章:http://news.csdn.net/a/20100726/277273.html,简单来说以推为主体。我猜测可能在某些情况下会使用拉,例如这个账号很久不登录,太不活跃,给他推东西纯属浪费。嗯。。。,这方面也欢迎一起来猜猜。

基于这些,我猜测的第1版架构图(我们现在就是这样做的,规模比较小,还看不出问题):



整个架构基于memcached + mysql,图中分了ABC三个区域。所有的消息存储在mysql中,无论推送给多少人,只存储一份。另外有一个索引表,用来记录推送关系,推送给1000个人,就增加1000条记录,也就是图中的A。当发生查询时,从索引表中根据用户编号进行一次简单查询(基于用户编号为索引和条件的select),拿到索引结果后,进入B,从memcached中读取实际信息。如果不存在或者不全,进入C,根据索引信息读取网友实际发表或者转载的内容,用模板生成消息并存储到memcached中,然后返回来。

在整个过程中,B是memcached集群,性能应该问题不大。C是cache后面的东西,其中的数据库查询也是基于索引表中给的对象主键,分表条件等进行的分库分表基于主键的查询,性能问题应该也不大。关键是A区。我们现在的方案是用guzz框架把索引表分到单独的一组数据库中,然后根据用户id进行切表,每个人保留最多200条最新消息的索引。总的来说,每张表的大小还在控制内。对于像#话题#等也是一样的,建立索引表分发。无论怎样,实际的消息只有一份。

我猜测,sina微博第一版系统应该就是这样。架构简单实用。

但随着规模的扩大,A区索引表肯定会逐步出现大量性能问题。要升级到第二,第三版。这两个之间或许是一步到位的。

第二第三版架构猜测:

A区的性能问题不是mysql能够解决的,但幸好A区的数据结构非常简单。就是以 用户id+某个动态功能 为key下的一个固定大小的索引集合。最简单的办法就是把mysql换成nosql,这个数据结构用nosql应该非常容易实施。我没有用过nosql,但通过资料来看,相比mysql肯定是一大性能提升。我们暂且推测其为第二版方案吧。欢迎实际用过nosql的来谈谈行不行。

我们假设,第二版方案也解决不了问题。A区的性能问题太大了,怎么办?如果这样,我想索引系统只能是自己做了,谁也靠不住。我有个猜测,欢迎讨论。看下图。



这个架构是完全为feed定制的,我们为每个 用户id+某个动态功能 分配一个磁盘block。在索引表中,我们知道每条索引记录的大小是固定的(假设每条1k大小),而为用户提供的最多最新动态数也是固定的(假设200条)。那么我们这个block就分配固定的201K,前面的1k是头信息,后面的200k存储最多200条的索引记录。

在头信息中,记录这个块操作的系统版本号(升级使用),用户信息,操作的偏移量,总动态数等等。当插入一条新索引时,根据操作偏移量直接定位位置,写入;如果已经写到第200条,回到第一条覆盖写。读取的时候,根据偏移量数据直接读。因为记录大小固定,block维护简单,顺序读写,效率肯定不差。而这些block文件块,将存储在一套分布式文件系统中,依靠还算成熟的hadoop技术,无限扩展这个大集群。

相比数据库的优势,还省去了清理过期数据的问题。

这里面没有讨论block块缓存的问题,这是分布式文件系统的工作。对于不同的动态,可能block的大小会不一样,这都是可以的。

不知道猜的对不对。
  • 大小: 17.4 KB
  • 大小: 15.4 KB
分享到:
评论
36 楼 zijan 2011-03-10  
ray_linn 写道
说句不客气的,微博就是垃圾堆,而数据库不是存垃圾的地方,所以是垃圾的东西就不需要用数据库,只需要回到本来面目---文本格式就可以。

用户----我关注的用户,是个一对多的关系。这种connection不是垃圾,可以放数据库里。

每个用户有自己独立的folder(以ID code为名),自己发表的垃圾,就堆在这个folder里,当场就生成静态html。

然后一个用户登录了,就到自己关注的用户的folder里东读一点西读一点,其实都是静态HTML,你要觉得硬盘IO太多,也不妨放个memcache,不放,也不见得会怎么样。


至于这些文本怎么删除,其实只要跟踪一下用户登录就可以,还登录的用户是hot user,他们的内容可以keep住,不是hot user的,folder就可以由后台清空了


同意.
35 楼 xici_magic 2011-03-10  
应该是非关系型数据库
34 楼 ray_linn 2011-03-09  
抛出异常的爱 写道
ray_linn 写道
说句不客气的,微博就是垃圾堆,而数据库不是存垃圾的地方,所以是垃圾的东西就不需要用数据库,只需要回到本来面目---文本格式就可以。

用户----我关注的用户,是个一对多的关系。这种connection不是垃圾,可以放数据库里。

每个用户有自己独立的folder(以ID code为名),自己发表的垃圾,就堆在这个folder里,当场就生成静态html。

然后一个用户登录了,就到自己关注的用户的folder里东读一点西读一点,其实都是静态HTML,你要觉得硬盘IO太多,也不妨放个memcache,不放,也不见得会怎么样。


至于这些文本怎么删除,其实只要跟踪一下用户登录就可以,还登录的用户是hot user,他们的内容可以keep住,不是hot user的,folder就可以由后台清空了

如果有新的微博是否需要f5来刷新?
如果非f5刷新那怎么通知到?
靠对所有跟随者广播么?
如果广播那怎么知道我的跟随者是否在线?(非在线不通知)
如果收到了广播通知如何通知浏览器F5刷新页面?
如果刷新页面时是把所有新消息都刷出来还是只刷出来刚刚广播的消息?

以上求解惑


javascript难道是吃干饭的吗? 要我设计,每个垃圾信息都设计成xml格式,客户端用XSLT聚合起来就可以,还可以享受免费的browser cache
33 楼 ithero 2011-03-09  
这个主题我以前在论坛也发起贴讨论过,区别那是讨论具体实现,就本身用到的技术与架构谈不上复杂,主要是因为量而发生质变,具体实现就是数据分表+Cache层+推
32 楼 yujiang 2011-03-09  
推肯定不是整体全推送, 选择部分当时需要立即看到的去推, 比如最近N分钟还在线的.
对于微博还需要考虑按粉丝数量的划分的不同处理(推模式下甚至可以用专门的服务器处理特定的一批超热用户).

插个广告:
各位有兴趣于SNS各种系统开发的, 可以投简历到benyin#taobao.com (#替换为@), 我所在的团队负责淘宝SNS(淘江湖)的设计开发(其中有Feed分发系统, 信息实时推送系统, 推荐系统), 今年是淘宝SNS化的一年, 希望更多资深的开发工程师和架构师能加入我们.
31 楼 xjlsgcjdtc 2011-03-09  
lz的图画的真不错-_-!
30 楼 saharazhou 2011-03-09  
抛出异常的爱 写道
ray_linn 写道
说句不客气的,微博就是垃圾堆,而数据库不是存垃圾的地方,所以是垃圾的东西就不需要用数据库,只需要回到本来面目---文本格式就可以。

用户----我关注的用户,是个一对多的关系。这种connection不是垃圾,可以放数据库里。

每个用户有自己独立的folder(以ID code为名),自己发表的垃圾,就堆在这个folder里,当场就生成静态html。

然后一个用户登录了,就到自己关注的用户的folder里东读一点西读一点,其实都是静态HTML,你要觉得硬盘IO太多,也不妨放个memcache,不放,也不见得会怎么样。


至于这些文本怎么删除,其实只要跟踪一下用户登录就可以,还登录的用户是hot user,他们的内容可以keep住,不是hot user的,folder就可以由后台清空了

如果有新的微博是否需要f5来刷新?
如果非f5刷新那怎么通知到?
靠对所有跟随者广播么?
如果广播那怎么知道我的跟随者是否在线?(非在线不通知)
如果收到了广播通知如何通知浏览器F5刷新页面?
如果刷新页面时是把所有新消息都刷出来还是只刷出来刚刚广播的消息?

以上求解惑


同样求解
29 楼 抛出异常的爱 2011-03-09  
ray_linn 写道
说句不客气的,微博就是垃圾堆,而数据库不是存垃圾的地方,所以是垃圾的东西就不需要用数据库,只需要回到本来面目---文本格式就可以。

用户----我关注的用户,是个一对多的关系。这种connection不是垃圾,可以放数据库里。

每个用户有自己独立的folder(以ID code为名),自己发表的垃圾,就堆在这个folder里,当场就生成静态html。

然后一个用户登录了,就到自己关注的用户的folder里东读一点西读一点,其实都是静态HTML,你要觉得硬盘IO太多,也不妨放个memcache,不放,也不见得会怎么样。


至于这些文本怎么删除,其实只要跟踪一下用户登录就可以,还登录的用户是hot user,他们的内容可以keep住,不是hot user的,folder就可以由后台清空了

如果有新的微博是否需要f5来刷新?
如果非f5刷新那怎么通知到?
靠对所有跟随者广播么?
如果广播那怎么知道我的跟随者是否在线?(非在线不通知)
如果收到了广播通知如何通知浏览器F5刷新页面?
如果刷新页面时是把所有新消息都刷出来还是只刷出来刚刚广播的消息?

以上求解惑
28 楼 askjsp 2011-03-09  
<div class="quote_title">ray_linn 写道</div>
<div class="quote_div">说句不客气的,微博就是垃圾堆,而数据库不是存垃圾的地方,所以是垃圾的东西就不需要用数据库,只需要回到本来面目---文本格式就可以。 <br><br>用户----我关注的用户,是个一对多的关系。这种connection不是垃圾,可以放数据库里。 <br><br>每个用户有自己独立的folder(以ID code为名),自己发表的垃圾,就堆在这个folder里,当场就生成静态html。 <br><br>然后一个用户登录了,就到自己关注的用户的folder里东读一点西读一点,其实都是静态HTML,你要觉得硬盘IO太多,也不妨放个memcache,不放,也不见得会怎么样。 <br><br><br>至于这些文本怎么删除,其实只要跟踪一下用户登录就可以,还登录的用户是hot user,他们的内容可以keep住,不是hot user的,folder就可以由后台清空了</div>
<p> </p>
<p> 我觉得这个朋友说的有些道理</p>
27 楼 xgj1988 2011-03-09  
java_xiaoyi 写道
ch_space 写道
peterwei 写道
哥,你画的图也太恶心了吧,搞得我没有看的欲望。晚上抽空再看。想了解和深入的办法,就是我们自已去实现一个weibo,搭一下他们的架构。然后再回头看他们那些理论和谈话。

+1

++1

+++1
26 楼 samwalt 2011-03-09  
kyfxbl 写道
这图真的画得不好,太不认真了。你在办公室用白板,也要画得让大家看得舒服吧


汗。lz明显是用鼠标在电脑上画的啊。
白板是lz打个比方而已。
25 楼 ray_linn 2011-03-09  
说句不客气的,微博就是垃圾堆,而数据库不是存垃圾的地方,所以是垃圾的东西就不需要用数据库,只需要回到本来面目---文本格式就可以。

用户----我关注的用户,是个一对多的关系。这种connection不是垃圾,可以放数据库里。

每个用户有自己独立的folder(以ID code为名),自己发表的垃圾,就堆在这个folder里,当场就生成静态html。

然后一个用户登录了,就到自己关注的用户的folder里东读一点西读一点,其实都是静态HTML,你要觉得硬盘IO太多,也不妨放个memcache,不放,也不见得会怎么样。


至于这些文本怎么删除,其实只要跟踪一下用户登录就可以,还登录的用户是hot user,他们的内容可以keep住,不是hot user的,folder就可以由后台清空了
24 楼 samwalt 2011-03-09  
要不在纸上画了,拍照片传上来吧
23 楼 Jazag.van 2011-03-09  
学习学习,也算长见识了,一直搞企业级开发,互联网应用没接触过
22 楼 kyfxbl 2011-03-09  
这图真的画得不好,太不认真了。你在办公室用白板,也要画得让大家看得舒服吧
21 楼 zhangcs053 2011-03-09  
成为架构师。
20 楼 congdepeng 2011-03-09  
java_xiaoyi 写道
ch_space 写道
peterwei 写道
哥,你画的图也太恶心了吧,搞得我没有看的欲望。晚上抽空再看。想了解和深入的办法,就是我们自已去实现一个weibo,搭一下他们的架构。然后再回头看他们那些理论和谈话。

+1

++1


++9
19 楼 IPHONE3375 2011-03-09  
myreligion 写道
一个图有那么重要嘛,难道在办公室都不用白板。用白板也要拿尺子量着画?

只是您这个图太那个了
18 楼 myreligion 2011-03-09  
一个图有那么重要嘛,难道在办公室都不用白板。用白板也要拿尺子量着画?
17 楼 shixueyou521 2011-03-09  
java_xiaoyi 写道
ch_space 写道
peterwei 写道
哥,你画的图也太恶心了吧,搞得我没有看的欲望。晚上抽空再看。想了解和深入的办法,就是我们自已去实现一个weibo,搭一下他们的架构。然后再回头看他们那些理论和谈话。

+1

++1

+++1

相关推荐

    新浪微博发展研究报告

    - **新浪微博的地位**:截至报告撰写之时,新浪微博已成为国内领先的微博平台之一,在短时间内迅速积累了庞大的用户基础。 - **市场竞争态势**:新浪微博面临着来自腾讯等公司的激烈竞争,尤其是在社交媒体领域。 - ...

    中国的SNS路径?(之二)新浪微博不是Twitter.docx

    2. **社交媒体的新形态**:新浪微博不仅提供了类似Twitter的信息发布功能,还增加了评论、奖励系统、广场等特色功能,形成了一个更加丰富的社交生态。 3. **关系网的构建**:新浪微博采用Twitter式的Follow机制,...

    仿新浪微博程序thinksns

    而在中国,除了新浪官方的微博服务,还有一款名为ThinkSNS的开源社交网络系统,它以强大的功能和高度的可定制性,受到了众多开发者和企业的青睐。本文将对这款仿新浪微博程序——ThinkSNS进行深入探讨。 ThinkSNS,...

    IPhone平台新浪微博航班信息SNS的实现毕业论文.docx

    iPhone平台新浪微博航班信息SNS的实现毕业论文 摘要:本论文主要研究了基于iPhone平台的新浪微博航班信息SNS的实现,旨在提高旅行者的出行乐趣和社交体验。通过使用Objective-C语言和iOS平台,调用新浪微博的API,...

    基于IOS的新浪微博iPhone客户端的设计与实现毕业论文.doc

    在系统设计阶段,本论文的核心在于对新浪微博iPhone客户端进行功能性的需求分析和定义。需求分析明确了客户端应当具备的核心功能,例如发布微博、浏览微博流、用户之间的关注与互动、及时的消息通知等。这些功能需要...

    评论:新浪微博新版“借鉴”QQ空间的风险.docx

    如果新浪微博过于模仿QQ空间的SNS功能,很可能会失去一部分核心用户群体。这部分用户对微博的粘性来自于它对信息的快速传播与分享机制,而不是基于熟人关系的深度互动。对这部分用户而言,微博若失去了原有的特色,...

    未来资产报告分析新浪微博.docx

    这一数字显示出新浪微博在社交媒体领域的领先地位,尤其是在移动互联网领域。 2. **与腾讯的对比**:虽然新浪微博在微博市场占据主导,但腾讯的全产品线,尤其是Qzone,具有更大的市场份额。腾讯在综合社交产品中...

    基于新浪微博的数据挖掘及可视化研究.pdf

    新浪微博作为一个广受欢迎的SNS平台,它的数据挖掘及可视化研究具有很高的学术和实际应用价值。 #### 社团管理系统设计与实现 随着高校学生社团数量的激增和形式的多样化,传统的社团管理方式已经无法满足管理需求...

    新浪微博V5新版使用体验分析.docx

    2012年9月3日,新浪微博推出了V5新版,此次更新不仅是界面设计的升级,更是对其核心定位和服务功能的重大调整,标志着其从传统的信息媒体平台向全方位社交网络平台转型。 一、微博新定位 微博新定位的核心变化是从...

    Android新浪微博分享

    在Android应用开发中,集成新浪微博分享功能是一项常见的需求,它可以让用户方便地将应用内的内容发布到自己的新浪微博账号上,从而提升用户体验并增加用户互动。本文将深入探讨如何实现这一功能,包括所需的库、API...

    阿里投资新浪微博:马云的SNS之梦.docx

    阿里投资新浪微博:马云的SNS之梦.docx

    java 简单微博系统

    【Java简单微博系统】是一个基于JavaEE平台开发的社交网络服务(SNS)应用,它提供了丰富的社交媒体功能,包括好友关系管理、粉丝关注、信息发布、帖子转发、评论互动以及内容收藏和搜索等功能。这个系统适合初学者...

    新浪微博开放平台推出站内应用 全面提升应用品质.docx

    - **用户体验优化**:为了确保站内应用的一致性和高质量,新浪微博还发布了详细的开发指南和UI设计规范,帮助开发者快速理解和实现符合标准的应用程序。 - **多样化应用类型**:社交游戏、微博小工具等类型的应用...

    仿新浪微博多图选择功能源码.zip

    该源码项目名为"仿新浪微博多图选择功能源码.zip",主要针对的是安卓平台,旨在实现一个类似于新浪微博的应用内多图选择功能。这个功能在许多社交媒体应用中都非常常见,让用户能够方便地从手机相册中选取多张图片...

    记事狗微博系统 v4.7.4 Build 20140922 UTF-8.zip

    记事狗微博系统是一套创新的互动社区系统,其以微博为核心,兼有轻博、SNS和BBS特点,既可用来独立建站也可通过Ucenter和oauth接口与已有网站无缝整合,通过微博评论模块、关注转发机制打通全站的信息流、关系流,可...

    sns 数据结构设计

    在SNS平台中,用户信息和社交关系是核心数据。用户表应包含用户的基本信息,如用户ID、用户名、密码、注册信息等;社交关系表则需要记录用户之间的连接关系,例如好友关系、关注关系等。 8. 消息系统的设计: 消息...

    开源微博SNS路过插件

    路过插件.开源sns必备插件。

Global site tag (gtag.js) - Google Analytics