微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

标签: 微博 feed 系统 | 发表时间:2010-08-24 22:50 | 作者:草屋主人 荷泽
出处:http://www.cnblogs.com/sunli/

微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

     [文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-08-24]

     sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed架构,也就是推拉模式(timyang上次也分享了新浪微薄的模式)。下面我们就微博的feed推拉(push,pull)模式做一下探讨,并提出新的时间分区拉模式

      众所周知,在微博中,当你发表一篇微博,那么所有关注你的followers(粉丝)都会在一定的时间内收到你的微薄,这有点像群发一封邮件,所有的抄送者都会在一定的时间内收到。到这里,你可能觉得没有什么难度。我们看下下面的截图:

     

       图一:新浪微博姚晨

         图二:twitter上冯大辉

     新浪微博的姚晨粉丝有2594751,她发表任何一篇微博,都需要2594751个粉丝在一定的时间内收到,twitter的冯大辉发表一篇的话,需要19868个followers收到。

     相反,姚晨需要收到他关注的545个人的所有更新,冯大辉需要收到他关注的2525个人的所有更新。到这里,你是不是感觉到有那么一点点小挑战呢?

     下面我们看下微博一般的整体结构图:

      

                 图三:微博整体结构

       图中展示了微博的整体数据流程,先了解下整体的数据结构,没有涉及到followers等的推拉模式处理。下面我们再看下推模式(push):

          图四:推模式结构

   推模式需要把一篇微博推送给所有关注他的人(推给所有的粉丝),比如姚晨,我们就需要推送给2594751个用户的feeds表中。当然,feeds表可以很好的进行sharding,存储也都是一些数字型的字段,存储空间可能不是很大,用户在查询自己关注的所有人的feed时,速度快,性能非常高,但是推送量会非常大,姚晨发表一篇,就会产生200多万条数据。试想,一个大量用户的微薄系统通过使用推模式,是不是会产生非常惊人的数据呢?

    下面看下拉模式(pull)

            图五:拉模式

     拉模式只需要用户发表微博时,存储一条微博数据到feeds表中(feeds表可以是一个临时表,只保存近期可接受范围的数据).用户每次查询feed时都会去查询feeds表。比如姚晨打开自己的微薄首页,就产生:SELECT id FROM feeds where uid in(following uid list) ORDER BY id DESC LIMIT n(查询最新的n条),缓存到memcached

uidlist=>{data:id list,timeline:上次查询出来的最新的一条数据的时间}

再次刷新:SELECT id FROM feeds where uid in(following uid list) AND timeline>(memcached存储的上次的timeline) ORDER BY id DESC LIMIT n

 

    这种模式实现起来也是比较简单和容易的,只是在查询的时候需要多考虑下缓存的结构。但是feeds表会产生很大的压力,怎么说feeds表也要保存最近十天半个月的数据吧,对于一个大点的系统,这会产生比较大的数据,如果following的人数比较多,数据库的压力就会非常大。而且一般在线的用户,客户端都会定期扫描,又会增加很大的压力,这在查询性能上没有推模式的效率高。

     下面我们在对拉模式做一下改进优化

     

           图五:拉模式(pull)-改进(时间分区拉模式

           拉模式的改进主要是在feeds的存储上,使用按照时间进行分区存储。分为最近时间段(比如最近一个小时),近期的,比较长时期等等。我们再来看下查询的流程,比如姚晨登陆微博首页,假设缓存中没有任何数据,那么我们可以查询比较长时期的feeds表,然后进入缓存。下一次查询,通过查询缓存中的数据的timeline,如果timeline还在最近一个小时内,那么只需要查询最近一个小时的数据的feed表,最近一个小时的feeds表比图四的feeds表可要小很多,查询起来速度肯定快几个数量级了。

          改进模式的重点在于feeds的时间分区存储,根据上次查询的timeline来决定查询应该落在那个表。一般情况下,经常在线的用户,频繁使用的客户端扫描操作,经常登录的用户,都会落在最近的feeds表区间,查询都是比较高效的。只有那些十天,半个月才登录一次的用户需要去查询比较长时间的feeds大表,一旦查询过了,就又会落在最近时间区域,所以效率也是非常高的。

         关于时间的分区,需要根据数据量,用户访问特点进行一个合理的切分。如果数据发表量非常大,可以进行更多的分区。

        上面介绍的推模式和拉模式都有各自的特点,个人觉得时间分区拉模式弥补了图四的拉模式的很大的不足,是一个成本比较低廉的解决方案。当然,时间分区拉模式也可以结合推模式,根据某些特点来增加系统的性能。

        后记:本文的目的是介绍时间分区拉模式,本人对新浪微博和twitter等的推拉模式的细节并不清楚。

 

 

作者: 草屋主人 发表于 2010-08-24 22:50 原文链接

评论: 16 查看评论 发表评论


最新新闻:
· 国内已上市的互联网公司盘点(2010-12-14 13:55)
· 登月第一人披露首次月球漫步细节(2010-12-14 13:50)
· 顺网科技上市4月即重组 或10亿元收购竞争对手(2010-12-14 13:05)
· 三名黑客因参与维基解密网络战DDOS攻击被捕(2010-12-14 13:03)
· OS发布:Pyxis 2 Beta 2(2010-12-14 12:04)

编辑推荐:WP7有约(二):课后作业

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [微博 feed 系统] 推荐:

Feed 流系统杂谈

- - 掘金 架构
这是我参与「掘金日新计划 · 6 月更文挑战」的第2天, 点击查看活动详情. Feed 流是社交和资讯类应用中常见的一种形态, 比如微博知乎的关注页、微信的订阅号和朋友圈等. Feed 流源于 RSS 订阅, 用户将自己感兴趣的网站的 RSS 地址登记到 RSS 阅读器中, 在阅读器里聚合成的列表就是 Feed 流.

微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

- 荷泽 - 博客园-草屋主人的blog
微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨.      [文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-08-24].      sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed架构,也就是推拉模式(timyang上次也分享了新浪微薄的模式).

Feed 流系统设计总纲

- - 行业应用 - ITeye博客
差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等. 这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长. 这些产品都是 Feed 流类型产品,由于 Feed 流一般是按照时间“从上往下流动”,非常适合在移动设备端浏览,最终这一类应用就脱颖而出,迅速抢占了上一代产品的市场空间.

常用社交网络(SNS、人人网、新浪微博)动态新闻(feed、新鲜事、好友动态)系统浅析

- - 互联网 - ITeye博客
原文地址:http://blog.csdn.net/sunmenggmail/article/details/8472546. 最近见几个朋友都在说人人网新鲜事排序的问题,恰巧对这方面也较感兴趣,于是打算顺便把手头收集到的资料梳理学习一下. 由于本人也只是新手,很多内容仅仅是参阅资料后的个人猜测与纸上谈兵故难免存有错误与纰漏,感谢大家指正.

NLP 技术在微博 feed 流中的应用

- - IT瘾-tuicool
分享嘉宾:董兴华 新浪微博. 内容来源:DataFunTalk. 导读:新浪微博截止2019.9统计的数据,月活跃用户数为4.97亿,日活跃用户数为2.16亿,其中约94%为移动端用户,今天会和大家分享新浪微博在 feed 流中遇到的 NLP 问题和解决思路. ——难点与现存问题——. ❶  博文内容大多比较短.

Feed消息队列架构分析

- - Tim[后端技术]
最近一两年,大部分系统的数据流由基于日志的离线处理方式转变成实时的流式处理方式,并逐渐形成几种通用的使用方式,以下介绍微博的消息队列体系. 当前的主要消息队列分成如图3部分. 1、feed信息流主流程处理,图中中间的流程,通过相关MQ worker将数据写入cache、Redis及MySQL,以便用户浏览信息流.

Feed架构-我们做错了什么

- - Tim[后端技术]
在过去几年,所在的微博技术团队在一定程度成功解决了feed架构的扩展性与性能的问题,大部分精力已经从应对峰值性能或者数据扩展中解放出来. 几天前,拿着上面这张架构图问内部一些架构师,目前完成的工作及存在的主要问题是什么. 完成的工作不出意料,大家的观点比较类似,主要在架构的工程成熟度方面. 解决了数据规模大且长尾访问的问题,通过按时间线的冷热分区设计,在MySQL等数据库上成功实现了低成本的长尾分区实现.

Pinterest的Feed架构与算法

- - 后端技术 by Tim Yang
Pinterest首页的Feed消息流,最早是按照用户的关注对象的Pin(类似微博)聚合后按时间进行排序(自然序,类似朋友圈),后来版本的feed系统放弃了自然序,而是根据一定规则及算法来设计,内部称之为Smart feed,其算法及架构根据其公开资料整理如下,值得业界做信息流产品的技术架构师参考.

RSS Feed Search Engine -RSS 專用搜尋引擎

- votis - 免費資源網路社群
RSS Search Engine 是由知名部落格 Digital Inspiration 所建置的服務,主要功能是用來協助使用者發掘網路上的熱門 RSS Feeds,如同搜尋引擎,可以填入自己有興趣的主題,它就會找出相關熱門網站,比較不同的是會一併顯示 RSS 資訊,能更方便訂閱網站. 網站名稱:RSS Search Engine.

提供社群網站 RSS feed 的服務

- - Gea-Suan Lin's BLOG
在 Hacker News Daily 上看到的服務:「 RSS Box」,主要是有 open source,所以可以自己架起來跑 (只是得自己生 API key):「 RSS Box」. 測了一下目前的站台, Twitter 與 Instagram 的部份都已經撞到 rate limit,而 YouTube 的部份正常.