系統(tǒng)設(shè)計(jì) —— Feed 流

參考資料

如何打造千萬級Feed流系統(tǒng)
TableStore Timeline:輕松構(gòu)建千萬級IM和Feed流系統(tǒng)
Design the Twitter timeline and search
Feed系統(tǒng)架構(gòu)資料收集

1. 表結(jié)構(gòu)

1.1. Feed 內(nèi)容庫

內(nèi)容庫用于存儲(chǔ)用戶發(fā)送的消息。

列名 是否主鍵 說明
user_id yes 消息發(fā)送者的 id
message_id yes 消息 id诈乒,可以用時(shí)間戳
content no 消息內(nèi)容
other no 其他信息

1.2. 同步表

同步方式口蝠,常見的方式有三種:

  • 推模式(也叫寫擴(kuò)散):和名字一樣,就是一種推的方式拷淘,發(fā)送者發(fā)送了一個(gè)消息后讲衫,立即將這個(gè)消息推送給接收者肥印,但是接收者此時(shí)不一定在線,那么就需要有一個(gè)地方存儲(chǔ)這個(gè)數(shù)據(jù)入愧,這個(gè)存儲(chǔ)的地方我們稱為:同步庫鄙漏。推模式也叫寫擴(kuò)散的原因是嗤谚,一個(gè)消息需要發(fā)送個(gè)多個(gè)粉絲,那么這條消息就會(huì)復(fù)制多份怔蚌,寫放大巩步,所以也叫寫擴(kuò)散。這種模式下桦踊,對同步庫的要求就是寫入能力極強(qiáng)和穩(wěn)定椅野。讀取的時(shí)候因?yàn)橄⒁呀?jīng)發(fā)到接收者的收件箱了,只需要讀一次自己的收件箱即可籍胯,讀請求的量極小竟闪,所以對讀的QPS需求不大。歸納下杖狼,推模式中對同步庫的要求只有一個(gè):寫入能力強(qiáng)炼蛤。
  • 拉模式(也叫讀擴(kuò)散):這種是一種拉的方式,發(fā)送者發(fā)送了一條消息后蝶涩,這條消息不會(huì)立即推送給粉絲理朋,而是寫入自己的發(fā)件箱,當(dāng)粉絲上線后再去自己關(guān)注者的發(fā)件箱里面去讀取绿聘,一條消息的寫入只有一次嗽上,但是讀取最多會(huì)和粉絲數(shù)一樣,讀會(huì)放大斜友,所以也叫讀擴(kuò)散炸裆。拉模式的讀寫比例剛好和寫擴(kuò)散相反垃它,那么對系統(tǒng)的要求是:讀取能力強(qiáng)鲜屏。另外這里還有一個(gè)誤區(qū),很多人在最開始設(shè)計(jì)feed流系統(tǒng)時(shí)国拇,首先想到的是拉模式洛史,因?yàn)檫@種和用戶的使用體感是一樣的,但是在系統(tǒng)設(shè)計(jì)上這種方式有不少痛點(diǎn)酱吝,最大的是每個(gè)粉絲需要記錄自己上次讀到了關(guān)注者的哪條消息也殖,如果有1000個(gè)關(guān)注者,那么這個(gè)人需要記錄1000個(gè)位置信息务热,這個(gè)量和關(guān)注量成正比的忆嗜,遠(yuǎn)比用戶數(shù)要大的多,這里要特別注意崎岂,雖然在產(chǎn)品前期數(shù)據(jù)量少的時(shí)候這種方式可以應(yīng)付捆毫,但是量大了后就會(huì)事倍功半,得不償失冲甘,切記切記绩卤。
  • 推拉結(jié)合模式:推模式在單向關(guān)系中途样,因?yàn)榇嬖诖骎,那么一條消息可能會(huì)擴(kuò)散幾百萬次濒憋,但是這些用戶中可能有一半多是僵尸何暇,永遠(yuǎn)不會(huì)上線,那么就存在資源浪費(fèi)凛驮。而拉模式下裆站,在系統(tǒng)架構(gòu)上會(huì)很復(fù)雜,同時(shí)需要記錄的位置信息是天量黔夭,不好解決遏插,尤其是用戶量多了后會(huì)成為第一個(gè)故障點(diǎn)【佬蓿基于此胳嘲,所以有了推拉結(jié)合模式,大部分用戶的消息都是寫擴(kuò)散扣草,只有大V是讀擴(kuò)散了牛,這樣既控制了資源浪費(fèi),又減少了系統(tǒng)設(shè)計(jì)復(fù)雜度辰妙。但是整體設(shè)計(jì)復(fù)雜度還是要比推模式復(fù)雜鹰祸。

用圖表對比:

對比項(xiàng) 推模式 拉模式 推拉結(jié)合模式
寫放大
讀放大
用戶讀取延時(shí) 毫秒
讀寫比例 1:99 99:1 ~50:50
系統(tǒng)要求 寫能力強(qiáng) 讀能力強(qiáng) 讀寫都適中
常見系統(tǒng) Tablestore、Bigtable等LSM架構(gòu)的分布式NoSQL Redis密浑、memcache等緩存系統(tǒng)或搜索系統(tǒng)(推薦排序場景) 兩者結(jié)合
架構(gòu)復(fù)雜度 簡單 復(fù)雜 更復(fù)雜

介紹完同步模式中所有場景和模式后蛙婴,我們歸納下:

  • 如果產(chǎn)品中是雙向關(guān)系,那么就采用推模式尔破。
  • 如果產(chǎn)品中是單向關(guān)系街图,且用戶數(shù)少于1000萬,那么也采用推模式懒构,足夠了餐济。
  • 如果產(chǎn)品是單向關(guān)系,單用戶數(shù)大于1000萬胆剧,那么采用推拉結(jié)合模式絮姆,這時(shí)候可以從推模式演進(jìn)過來,不需要額外重新推翻重做秩霍。
  • 永遠(yuǎn)不要只用拉模式篙悯。
  • 如果是一個(gè)初創(chuàng)企業(yè),先用推模式铃绒,快速把系統(tǒng)設(shè)計(jì)出來鸽照,然后讓產(chǎn)品去驗(yàn)證、迭代匿垄,等客戶數(shù)大幅上漲到1000萬后移宅,再考慮升級為推拉集合模式归粉。
  • 如果是按推薦排序,那么是另外的考慮了漏峰,架構(gòu)會(huì)完全不一樣糠悼,這個(gè)后面專門文章介紹。

同步表的結(jié)構(gòu)如下

列名 是否主鍵 說明
user_id yes 消息接收者用戶ID
sequence_id yes 消息順序ID浅乔,可以使用timestamp + send_user_id倔喂,也可以直接使用Tablestore的自增列。
sender_id no 消息發(fā)送者的用戶ID
message_id no store_table中的message_id列的值靖苇,也就是消息ID席噩。通過sender_id和message_id可以到store_table中查詢到消息內(nèi)容
other no 其他信息
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贤壁,隨后出現(xiàn)的幾起案子悼枢,更是在濱河造成了極大的恐慌,老刑警劉巖脾拆,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馒索,死亡現(xiàn)場離奇詭異,居然都是意外死亡名船,警方通過查閱死者的電腦和手機(jī)绰上,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渠驼,“玉大人蜈块,你說我怎么就攤上這事∶陨龋” “怎么了百揭?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谋梭。 經(jīng)常有香客問我信峻,道長,這世上最難降的妖魔是什么瓮床? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮产镐,結(jié)果婚禮上隘庄,老公的妹妹穿的比我還像新娘。我一直安慰自己癣亚,他們只是感情好丑掺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著述雾,像睡著了一般街州。 火紅的嫁衣襯著肌膚如雪兼丰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天唆缴,我揣著相機(jī)與錄音鳍征,去河邊找鬼。 笑死面徽,一個(gè)胖子當(dāng)著我的面吹牛艳丛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趟紊,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼氮双,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了霎匈?” 一聲冷哼從身側(cè)響起戴差,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铛嘱,沒想到半個(gè)月后造挽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弄痹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年饭入,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛真。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谐丢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚓让,到底是詐尸還是另有隱情乾忱,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布历极,位于F島的核電站窄瘟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趟卸。R本人自食惡果不足惜蹄葱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锄列。 院中可真熱鬧图云,春花似錦、人聲如沸邻邮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筒严。三九已至丹泉,卻和暖如春情萤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摹恨。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工筋岛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睬塌。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓泉蝌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揩晴。 傳聞我的和親對象是個(gè)殘疾皇子勋陪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 簡介 Feed流系統(tǒng)特點(diǎn) Feed流系統(tǒng)是一個(gè)數(shù)據(jù)流系統(tǒng),所以我們核心要看數(shù)據(jù)硫兰。從數(shù)據(jù)層面看诅愚,數(shù)據(jù)分為三類,分別是...
    宮若石閱讀 1,018評論 0 4
  • 習(xí)慣會(huì)影響一個(gè)人做事的方式劫映,也會(huì)直接影響效率违孝。我經(jīng)常在項(xiàng)目完成后自我總結(jié),有哪些做得好的泳赋,有哪些做得不好的雌桑?然后把...
    sunljz閱讀 8,031評論 29 174
  • 近來發(fā)生不少事情,感覺還是想寫點(diǎn)東西 每每說起友情祖今,總能想起李白的《贈(zèng)汪倫》校坑,一人岸邊踏歌,一人舟頭回望千诬,便已將此...
    古雞蛋閱讀 121評論 0 1
  • 文丨紅瑀 【系列連載】生活在臺灣(目錄) 廣東人的主食是米飯耍目,我就愛吃飯,不怎么吃面徐绑,尤其是湯面更不愛邪驮,至于其他面...
    紅瑀閱讀 3,841評論 48 29
  • 這是“心靈對話.寫作"小組第8篇文章 每天晨起到辦公室,第一時(shí)間就是擺弄下我那些花花草草傲茄,雖然沒有什么名貴的品...
    落字生香閱讀 271評論 1 0