偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

feed 流,讀擴散,寫擴散?

開發(fā) 架構
什么是 feed 流?什么是讀擴散?什么是寫擴散?今天和大家聊聊這幾個話題。

文章《群消息,究竟存一份還是多份?)》中童鞋提到:群消息,存一份還是多份,如同feed流中的讀擴散與寫擴散。

什么是feed流?什么是讀擴散?什么是寫擴散?今天和大家聊聊這幾個話題。

哪些產品是feed流典型業(yè)務?

微博,微信朋友圈,Pinterest是典型的feed流業(yè)務,系統(tǒng)中的每一條消息就是一個feed。

這類業(yè)務有什么特點?

  • 有好友關系,例如關注,粉絲;
  • 我們的主頁由別人發(fā)布的feed組成;

這類業(yè)務的核心業(yè)務動作是什么?

  • 關注,取關;
  • 發(fā)布feed;
  • 拉取自己的主頁feed流;

這類業(yè)務的核心元數(shù)據(jù)是什么?

  • 關系數(shù)據(jù);
  • feed數(shù)據(jù);

feed流的“拉取”與“推送”實現(xiàn),是個怎么回事?

feed流業(yè)務最大的特點是“我們的主頁由別人發(fā)布的feed組成”,獲得朋友圈消息feed流集合,從技術上說,主要有:

  • 拉?。ㄗx擴散);
  • 推送(寫擴散);

兩種方式。feed流的推與拉主要指的是這里。

什么是拉模式 ,讀擴散方案?

例如,某feed系統(tǒng)里有ABCD四個用戶,其中:

(1) A關注了BC,D關注了B;

其關系存儲又包含關注關系與粉絲關系,“A關注了BC,D關注了B”的潛臺詞是“B有兩個粉絲AD,C有一個粉絲A”。

(2) B發(fā)布過四條feed:msg1, msg3, msg5, msg10;

(3) C發(fā)布過兩條feed:msg2, msg8;

每一個用戶,都有一個feed隊列,記錄自己曾經發(fā)布的所有feed數(shù)據(jù)。

拉模式讀擴散如何實現(xiàn)feed發(fā)布?

在拉模式中,發(fā)布一條feed的流程非常簡單,例如C新發(fā)布了一條msg12:

此時只需往C的feed隊列里加入一條feed即可。

拉模式讀擴散如何實現(xiàn)關注/取關?

在拉模式中,取消關注的流程也非常簡單,例如A取消關注C:

此時只需要在A的關注列表里刪除C,并在C的粉絲列表里刪除A即可。

拉模式讀擴散如何實現(xiàn)個人主頁feed流?

在拉模式中,用戶A獲取“由別人發(fā)布的feed組成的主頁”的過程極其復雜,此時需要:

  • 獲取A的關注列表;
  • 獲取所關注列表中,所有用戶發(fā)布的feed;
  • 對消息進行rank排序(假設按照發(fā)布時間排序),分頁取出對應的一頁feeds;

拉模式讀擴散有什么優(yōu)點?

  • 存儲結構簡單,數(shù)據(jù)存儲量較小,關系數(shù)據(jù)與feed數(shù)據(jù)都只存一份;
  • 關注,取關,發(fā)布feed的業(yè)務流程非常簡單;
  • 存儲結構,業(yè)務流程都比較容易理解,適合項目早期用戶量、數(shù)據(jù)量、并發(fā)量不大時的快速實現(xiàn);

拉模式讀擴散有什么缺點?

  • 拉取朋友圈feed流列表的業(yè)務流程非常復雜;
  • 有多次數(shù)據(jù)訪問,并且要進行大量的內存計算,網絡傳輸,性能較低;

什么是推模式 ,寫擴散方案?

推模式(寫擴散),關系數(shù)據(jù)的存儲與拉模式(讀擴散)完全一樣。

feed數(shù)據(jù),每個用戶也存儲自己發(fā)布的feed。

如上圖:

  • B曾經發(fā)布過1,3,5,10;
  • C曾經發(fā)布過2,8;

畫外音:不妨設,這里的msgid按照feed的發(fā)布時間偏序。

feed數(shù)據(jù)存儲,與拉(讀擴散)不同的是,每個用戶還需要存儲自己收到的feed流。

如上圖:

  • A關注了BC,所以A的接收隊列是1,2,3,5,8,10;
  • D關注了B,所以D的接受隊列是1,3,5,10;

推模式寫擴散如何實現(xiàn)個人主頁feed流?

在推模式(寫擴散)中,獲取“由別人發(fā)布的feed組成的主頁”會變得異常簡單,假設一頁消息為3條feed,A如果要看自己朋友圈的第二頁消息,直接返回1,2,3即可。

畫外音:第一頁朋友圈是最新的消息,即5,8,10。

推模式寫擴散如何實現(xiàn)feed發(fā)布?

在推模式(寫擴散)中,發(fā)布一條feed的流程會更復雜一點。

例如B新發(fā)布了一條msg12:

  • 在B的發(fā)布feed存儲里加入消息12;
  • 查詢B全部粉絲AD;
  • 在粉絲AD的接收feed存儲里也加入消息12;

之所以該方案稱為推模式(寫擴散),就是因為,用戶發(fā)布feed的時候:

  • 直接將feed推到了粉絲的接收列表里,故稱為“推模式”;
  • 不止寫發(fā)布feed存儲,而且要寫多個粉絲的接收feed存儲,故稱為“寫擴散”;

推模式寫擴散如何實現(xiàn)關注/取關?

在推模式(寫擴散)中,添加關注的流程也會變得復雜。

例如D新增關注C:

  • 在D的關注存儲里添加C;
  • 在C的粉絲存儲里添加D;
  • 在D的接收feed存儲里加入C發(fā)布的feed;

畫外音:有些產品有這樣的邏輯,“關注之后才能看到feed”,這樣的話就不需要第三步,舊feed無需插入。

在推模式(寫擴散)中,取消關注的流程也會變得復雜。

例如A取消關注C:

  • 在A的關注存儲里刪除C;
  • 在C的粉絲存儲里刪除A;
  • 在A的接收feed存儲里刪除C發(fā)布的feed;

推模式寫擴散有什么優(yōu)點?

  • 消除了拉模式(讀擴散)的IO集中點,每個用戶都讀自己的數(shù)據(jù),高并發(fā)下鎖競爭少;

畫外音:拉模式(讀擴散)中,用戶發(fā)布feed存儲容易成為IO瓶頸。

  • 拉取朋友圈feed流列表的業(yè)務流程異常簡單,速度很快;
  • 拉取朋友圈feed流列表,不需要進行大量的內存計算,網絡傳輸,性能很高;

畫外音:feed業(yè)務是典型的讀多寫少業(yè)務場景,讀寫比甚至高于100:1,即平均發(fā)布1條消息,有至少100次閱讀。

推模式寫擴散有什么缺點?

(1) 極大極大消耗存儲資源,feed數(shù)據(jù)會存儲很多份,例如楊冪5KW粉絲,她每次一發(fā)博文,消息會冗余5KW份;

畫外音:有朋友提出,可以存儲一份消息實體,只冗余msgid,這樣的話,拉取feed流列表時,還要再次拉取實體,網絡時延會更長,所以很多公司選擇直接冗余消息實體,當然,這是一個用戶體驗與存儲量的折衷設計。

(2) 新增關注,取消關注,發(fā)布feed的業(yè)務流會更復雜;

小結

feed流業(yè)務的推拉模式:

  • 拉模式,讀擴散,feed存一份,存儲小,用戶集中訪問數(shù)據(jù),性能差;
  • 推模式,寫擴散,feed存多份,用冗余存儲換鎖沖突,性能高;

知其然,知其所以然。

思路比結論更重要。

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2022-01-05 09:27:24

讀擴散寫擴散feed

2022-05-25 08:06:37

MySQL分庫分表

2019-08-21 07:44:32

離線消息拉取開發(fā)

2024-05-10 07:58:03

2025-07-10 14:54:13

AI模型圖像生成

2023-11-12 21:37:56

Feed流

2025-02-27 13:45:00

2019-03-13 08:33:30

物聯(lián)網設備物聯(lián)網IOT

2023-12-07 13:07:59

3D模型訓練

2024-01-07 20:20:46

2021-09-07 11:51:25

勒索軟件惡意軟件安全

2023-08-18 14:31:00

模型論文

2022-10-19 14:17:32

圖像模型

2024-12-13 12:07:15

2025-11-03 08:40:00

2021-08-19 16:03:20

勒索軟件攻擊數(shù)據(jù)泄露

2024-10-16 10:20:00

2024-12-23 13:30:00

2024-06-05 16:22:11

2024-03-27 10:20:31

模型場景
點贊
收藏

51CTO技術棧公眾號