Twitter维护时间线的方式竟和我们如出一辙

今天看到一篇技术文章,介绍twitter在早期(用户数小于等于1.5亿),架构的主要思路,读了以后,第一个感觉就是,项目的工程化,在很多时候都是相似的,不同的公司,不同的国家,不同的文化,不同的工程师,但是却有着相同的工程化思路。

时间线

首先,我们要普及一个叫“时间线”的概念。

我理解的时间线就是外国的“朋友圈”,朋友圈是我的朋友以发圈文章的时间从晚到早依次排列,而时间线就是我关注的用户发的消息,按时间降序排列。

社交类的应用,时间线通常有两种,一种是我的时间线,另外一种是别人的时间线,我的时间线就是我自己的推文,而别人的时间线就是我关注用户的推文。

Twitter

twitter在1.5亿用户的规模时,每秒钟写入消息的条数是6000,我们可以认为每秒钟有6000人每人都发了一条twitter,大部分的人还是以读为主,这是一个典型的读多写少的应用。

每秒钟6000条的写入在强大的硬件设备上不是问题,但是要读就不行了,你能想象有大量用户同时在一个库上执行下面的SQL语句么?

select m.content
from follow f
inner join message m
on m.user_id = f.user_id
where f.follow_id = ?
limit ?;

数据库必死无疑。(这条SQL是我自己猜测的,内部的结构可能不是这样)

于是twitter的工程师想了一个办法来减少数据库的读操作,就是把每个用户的时间线都存放在redis集群中。具体的操作是每当有新的消息写入时,如果关注这个用户的关注者少于5000,那就把这条消息写到redis集群中,每个用户的时间线都从redis集群读取。

这看起来是个好方法,但是为什么说是5000个用户呢?因为一旦超过这个数字,即使是写入redis,也需要大量的时间,假设一个超级巨星的关注者有5000万,这个操作会耗费巨大的代价。

所以对于大于5000粉丝的用户,并不会把ta的twitter通过redis集群同步给每个关注者,而是要等用户自己请求,只有当用户访问自己的时间线时,twitter的系统才会去查询。

实际上,如果连续30天用户甚至没有登录twitter的话,连redis集群中也不会再保存不活跃用户的时间线,如果用户后来又登录了,就去数据库查询,但为了保护脆弱的数据库,也只会查最新的800条消息。

维护在redis中用户的时间线,有个小技巧,就是只存消息的ID,不存消息的具体内容,但是我猜测,消息仍然是存到redis中,只是不是同一个key而已,用户数量如此庞大的基础上,是不可能直接查库的。

我们

我现在所在的项目组也在维护一个社交产品,它其中一部分功能与twitter非常相似,是一个叫关注的功能。也有个别大V的关注者非常多。

当我们在最开始规划这个功能的时候,首先考虑的就是当一个用户发表了消息,通过消息中间件或者是redis同步给用户,但是同步大V消息的时候,可就不那么简单了。

我们重新捋了一下思路,觉得我们的应用是在一个初期的阶段,虽然有一些大V的关注者非常多,但是大部分人远不能和大V相比,加上活跃用户数占比并不太高,扪心自问,是否真的需要使用复杂的方案?

最后我们确定的方案是,所有用户的时间线都通过主动查询的方式来维护,同样为了保护脆弱的数据库,主动查询的消息会被缓存起来,并且缓存的有效期设置了一个折中的时间,有缓存的也是有坏处的,比如我关注的用户推送了新的消息,但我因为缓存的缘故,可能无法马上读到。

维护用户的时间线,存的也是消息的ID,具体的内容存到redis的另一个key中,这点和twitter也非常相似。

当时的想法是,如果用户没有规模大到一个地步,我们暂时就使用这种相对简单的方案。在redis能解决问题的情况下,尽量保持架构的简单。大量的使用redis,在表示关系的时候,尽量使用ID和具体内容分离的方案。

归纳

当我看到介绍twitter架构的那篇文章后,想到原来做项目的时候做的决策,虽然当时我们并不知道twitter的作法,但现在看来有“心有灵犀”的感觉,架构是跟随用户规模迭代的,在每个时期构建最合适、最接地气的架构,不贸然扩大问题规模,是我们共同的选择。

twitter有一个地方和我们不同,就是使用了图数据库来保存用户之间的关注关系,但我们使用的还是传统的关系型数据库,为了查找关系的时候更快,我们把所有用户之间的关系也都放在了redis中,考虑到关注之间的关系还有取消关注的情况,我们使用的redis数据结构是zset,用score来表示是否关注的状态。

问题

不知道你是否接触过社交类的应用呢?你在处理时间线的时候,方案是什么?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容