要是不清楚什么是feed,google之。?
Feed是sns類應(yīng)用的核心和最復(fù)雜的部分,就是sina微博中看到的“我關(guān)注的人”的消息。像人人網(wǎng)中的“新鮮事”等等,都是一個東西。你想啊,你關(guān)注了幾千人,又被幾千人關(guān)注,你發(fā)了一個消息,另外幾千人怎么看到哪?拿數(shù)據(jù)庫做join和in操作肯定立刻掛。而且像sina weibo,數(shù)據(jù)和訪問量龐大,怎么實現(xiàn)哪?這其實就是傳說中的推和拉的選擇,人人網(wǎng)寫過一篇文章:http://news.csdn.net/a/20100726/277273.html,簡單來說以推為主體。我猜測可能在某些情況下會使用拉,例如這個賬號很久不登錄,太不活躍,給他推東西純屬浪費。嗯。。。,這方面也歡迎一起來猜猜。?
基于這些,我猜測的第1版架構(gòu)圖(我們現(xiàn)在就是這樣做的,規(guī)模比較小,還看不出問題):?
?
整個架構(gòu)基于memcached + mysql,圖中分了ABC三個區(qū)域。所有的消息存儲在mysql中,無論推送給多少人,只存儲一份。另外有一個索引表,用來記錄推送關(guān)系,推送給1000個人,就增加1000條記錄,也就是圖中的A。當(dāng)發(fā)生查詢時,從索引表中根據(jù)用戶編號進(jìn)行一次簡單查詢(基于用戶編號為索引和條件的select),拿到索引結(jié)果后,進(jìn)入B,從memcached中讀取實際信息。如果不存在或者不全,進(jìn)入C,根據(jù)索引信息讀取網(wǎng)友實際發(fā)表或者轉(zhuǎn)載的內(nèi)容,用模板生成消息并存儲到memcached中,然后返回來。?
在整個過程中,B是memcached集群,性能應(yīng)該問題不大。C是cache后面的東西,其中的數(shù)據(jù)庫查詢也是基于索引表中給的對象主鍵,分表條件等進(jìn)行的分庫分表基于主鍵的查詢,性能問題應(yīng)該也不大。關(guān)鍵是A區(qū)。我們現(xiàn)在的方案是用guzz框架把索引表分到單獨的一組數(shù)據(jù)庫中,然后根據(jù)用戶id進(jìn)行切表,每個人保留最多200條最新消息的索引。總的來說,每張表的大小還在控制內(nèi)。對于像#話題#等也是一樣的,建立索引表分發(fā)。無論怎樣,實際的消息只有一份。?
我猜測,sina微博第一版系統(tǒng)應(yīng)該就是這樣。架構(gòu)簡單實用。?
但隨著規(guī)模的擴(kuò)大,A區(qū)索引表肯定會逐步出現(xiàn)大量性能問題。要升級到第二,第三版。這兩個之間或許是一步到位的。?
第二第三版架構(gòu)猜測:?
A區(qū)的性能問題不是mysql能夠解決的,但幸好A區(qū)的數(shù)據(jù)結(jié)構(gòu)非常簡單。就是以 用戶id+某個動態(tài)功能 為key下的一個固定大小的索引集合。最簡單的辦法就是把mysql換成nosql,這個數(shù)據(jù)結(jié)構(gòu)用nosql應(yīng)該非常容易實施。我沒有用過nosql,但通過資料來看,相比mysql肯定是一大性能提升。我們暫且推測其為第二版方案吧。歡迎實際用過nosql的來談?wù)勑胁恍小?span id="wmqeeuq" class="Apple-converted-space">?
我們假設(shè),第二版方案也解決不了問題。A區(qū)的性能問題太大了,怎么辦?如果這樣,我想索引系統(tǒng)只能是自己做了,誰也靠不住。我有個猜測,歡迎討論。看下圖。?
?
這個架構(gòu)是完全為feed定制的,我們?yōu)槊總€ 用戶id+某個動態(tài)功能 分配一個磁盤block。在索引表中,我們知道每條索引記錄的大小是固定的(假設(shè)每條1k大小),而為用戶提供的最多最新動態(tài)數(shù)也是固定的(假設(shè)200條)。那么我們這個block就分配固定的201K,前面的1k是頭信息,后面的200k存儲最多200條的索引記錄。?
在頭信息中,記錄這個塊操作的系統(tǒng)版本號(升級使用),用戶信息,操作的偏移量,總動態(tài)數(shù)等等。當(dāng)插入一條新索引時,根據(jù)操作偏移量直接定位位置,寫入;如果已經(jīng)寫到第200條,回到第一條覆蓋寫。讀取的時候,根據(jù)偏移量數(shù)據(jù)直接讀。因為記錄大小固定,block維護(hù)簡單,順序讀寫,效率肯定不差。而這些block文件塊,將存儲在一套分布式文件系統(tǒng)中,依靠還算成熟的hadoop技術(shù),無限擴(kuò)展這個大集群。?
相比數(shù)據(jù)庫的優(yōu)勢,還省去了清理過期數(shù)據(jù)的問題。?
這里面沒有討論block塊緩存的問題,這是分布式文件系統(tǒng)的工作。對于不同的動態(tài),可能block的大小會不一樣,這都是可以的。?
不知道猜的對不對。
Feed是sns類應(yīng)用的核心和最復(fù)雜的部分,就是sina微博中看到的“我關(guān)注的人”的消息。像人人網(wǎng)中的“新鮮事”等等,都是一個東西。你想啊,你關(guān)注了幾千人,又被幾千人關(guān)注,你發(fā)了一個消息,另外幾千人怎么看到哪?拿數(shù)據(jù)庫做join和in操作肯定立刻掛。而且像sina weibo,數(shù)據(jù)和訪問量龐大,怎么實現(xiàn)哪?這其實就是傳說中的推和拉的選擇,人人網(wǎng)寫過一篇文章:http://news.csdn.net/a/20100726/277273.html,簡單來說以推為主體。我猜測可能在某些情況下會使用拉,例如這個賬號很久不登錄,太不活躍,給他推東西純屬浪費。嗯。。。,這方面也歡迎一起來猜猜。?
基于這些,我猜測的第1版架構(gòu)圖(我們現(xiàn)在就是這樣做的,規(guī)模比較小,還看不出問題):?

整個架構(gòu)基于memcached + mysql,圖中分了ABC三個區(qū)域。所有的消息存儲在mysql中,無論推送給多少人,只存儲一份。另外有一個索引表,用來記錄推送關(guān)系,推送給1000個人,就增加1000條記錄,也就是圖中的A。當(dāng)發(fā)生查詢時,從索引表中根據(jù)用戶編號進(jìn)行一次簡單查詢(基于用戶編號為索引和條件的select),拿到索引結(jié)果后,進(jìn)入B,從memcached中讀取實際信息。如果不存在或者不全,進(jìn)入C,根據(jù)索引信息讀取網(wǎng)友實際發(fā)表或者轉(zhuǎn)載的內(nèi)容,用模板生成消息并存儲到memcached中,然后返回來。?
在整個過程中,B是memcached集群,性能應(yīng)該問題不大。C是cache后面的東西,其中的數(shù)據(jù)庫查詢也是基于索引表中給的對象主鍵,分表條件等進(jìn)行的分庫分表基于主鍵的查詢,性能問題應(yīng)該也不大。關(guān)鍵是A區(qū)。我們現(xiàn)在的方案是用guzz框架把索引表分到單獨的一組數(shù)據(jù)庫中,然后根據(jù)用戶id進(jìn)行切表,每個人保留最多200條最新消息的索引。總的來說,每張表的大小還在控制內(nèi)。對于像#話題#等也是一樣的,建立索引表分發(fā)。無論怎樣,實際的消息只有一份。?
我猜測,sina微博第一版系統(tǒng)應(yīng)該就是這樣。架構(gòu)簡單實用。?
但隨著規(guī)模的擴(kuò)大,A區(qū)索引表肯定會逐步出現(xiàn)大量性能問題。要升級到第二,第三版。這兩個之間或許是一步到位的。?
第二第三版架構(gòu)猜測:?
A區(qū)的性能問題不是mysql能夠解決的,但幸好A區(qū)的數(shù)據(jù)結(jié)構(gòu)非常簡單。就是以 用戶id+某個動態(tài)功能 為key下的一個固定大小的索引集合。最簡單的辦法就是把mysql換成nosql,這個數(shù)據(jù)結(jié)構(gòu)用nosql應(yīng)該非常容易實施。我沒有用過nosql,但通過資料來看,相比mysql肯定是一大性能提升。我們暫且推測其為第二版方案吧。歡迎實際用過nosql的來談?wù)勑胁恍小?span id="wmqeeuq" class="Apple-converted-space">?
我們假設(shè),第二版方案也解決不了問題。A區(qū)的性能問題太大了,怎么辦?如果這樣,我想索引系統(tǒng)只能是自己做了,誰也靠不住。我有個猜測,歡迎討論。看下圖。?

這個架構(gòu)是完全為feed定制的,我們?yōu)槊總€ 用戶id+某個動態(tài)功能 分配一個磁盤block。在索引表中,我們知道每條索引記錄的大小是固定的(假設(shè)每條1k大小),而為用戶提供的最多最新動態(tài)數(shù)也是固定的(假設(shè)200條)。那么我們這個block就分配固定的201K,前面的1k是頭信息,后面的200k存儲最多200條的索引記錄。?
在頭信息中,記錄這個塊操作的系統(tǒng)版本號(升級使用),用戶信息,操作的偏移量,總動態(tài)數(shù)等等。當(dāng)插入一條新索引時,根據(jù)操作偏移量直接定位位置,寫入;如果已經(jīng)寫到第200條,回到第一條覆蓋寫。讀取的時候,根據(jù)偏移量數(shù)據(jù)直接讀。因為記錄大小固定,block維護(hù)簡單,順序讀寫,效率肯定不差。而這些block文件塊,將存儲在一套分布式文件系統(tǒng)中,依靠還算成熟的hadoop技術(shù),無限擴(kuò)展這個大集群。?
相比數(shù)據(jù)庫的優(yōu)勢,還省去了清理過期數(shù)據(jù)的問題。?
這里面沒有討論block塊緩存的問題,這是分布式文件系統(tǒng)的工作。對于不同的動態(tài),可能block的大小會不一樣,這都是可以的。?
不知道猜的對不對。